一.简介
1.事务:是一组操作的集合,是一个不可分割的单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败
2.事务中抛出异常,要回滚事务
3.默认MySQL的事务会自动提交,也就是说当执行一条DML语句,MySQL会立即隐式的提交事务
二.事务操作
1.查看事务提交的方式:
(1)语法:SELECT @@autocommit;
(2)结果为1就是自动提交,结果为0就是手动提交
2.设置事务提交的方式:
(1)语法:SET @@autocommit=0;
(2)设置为0就是手动提交,设置为1就是自动提交
3.提交事务:
(1)语法:COMMIT;
(2)设置为手动提交的事务,执行SQL语句后不提交数据就不会发生改变
(3)设置手动提交后的SQL语句,每一条语句都要执行一次COMMIT
4.回滚事务
5.开启事务:
(1)语法:START TRANSACTION 或 BEGIN;
(2)如果是自动提交设置开启事务后(START TRANSACTION 或 BEGIN),也要手动提交和回滚事务
三.四大特性ACID
1.原子性:事务是不可分割的最小操作单元,要么全部成功,要么全部失败
2.一致性:事务完成时,必须使所有的数据都保持一致状态
3.隔离性:数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
4.持久性:事务一旦提交或回滚,他对数据库中的数据的改变就是永久的
四.并发事务问题
1.脏读:一个事务读到另外一个事务还没有提交的数据
2.不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读
3.幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了幻影
五.事务隔离级别-解决并发事务问题
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Read uncommitted | ✔ | ✔ | ✔ |
Read committed | ❌ | ✔ | ✔ |
Repeatable Read | ❌ | ❌ | ✔ |
Serializable | ❌ | ❌ | ❌ |
1.MySQL中默认的隔离级别是:Repeatable Read
2.表中从上到下隔离级别越来越高(❌表示不会出现该问题)
3.Serializable最厉害,数据最安全,但是效率也最低
4.查看事务的隔离级别:
(1)语法:SELECT @@TRANSACTION_ISOLATION
5.设置事务的隔离级别:
(1)语法:SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]
(2)SESSION与GLOBAL
- SESSION表示针对当前客户端窗口有效
- GLOBAL表示所有客户端窗口有效