事务 是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
查看/设置事务提交方式
SELECT @@autocommit ;
SET @@autocommit = 0 ;
提交事务
COMMIT;
回滚事务
-- 当执行出现异常执行回滚事务
ROLLBACK;
开启事务
START TRANSACTION 或 BEGIN ;
提交事务
COMMIT;
回滚事务
ROLLBACK;
-- 关闭自动提交
SET autocommit = 0 ;
-- 开启事务
START TRANSACTION
UPDATE usermoney set money = money -100 WHERE id = 1
UPDATE usermoney set money = money +100 WHERE id = 2
-- ROLLBACK;
COMMIT;
SET autocommit = 1 ;
1.赃读:一个事务读到另外一个事务还没有提交的数据。
比如B读取到了A未提交的数据,即A执行update后的数据被事务B读取到。
2.不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。
如图,当事务A执行查询id=1后,事务B更新id= 1的数据,然后事务A在执行执行查询id=1 数据,两次查询的数据不一样。
3.幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了 “幻影”。
如图,第一步:执行查询时,没有找到对应的数据,第二步:事务B插入id = 1的数据,此时数据库中已经有id = 1的数据; 第三步:事务A再插入id = 1的数据,会插入失败,(id为主键)因为主键冲突或者重复了。第四步:事务A 再执行查询id=1的数据依旧查不到(因为已经解决重复读的问题)
小结:
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Read uncommitted | √ | √ | √ |
Read committed | × | √ | √ |
Repeatable Read(默认) | × | × | √ |
Serializable | × | × | × |
允许一个事务读取另一个事务未提交的数据,可能导致脏读,幻读,和不可重复读。
一个事务只能读取另一个事务已经提交的数据,避免了脏读,但仍可能出现幻读和不可重复读。
在一个事务中,多次读取相同的数据会保持一致性,避免了脏读和不可重复读。但仍可能出现幻读。
最高的隔离级别,确保事务的串行执行,避免了脏读,不可重读和幻读。但性能较差。
事务隔离级别越高,数据越安全,但是性能越低。
查看事务隔离级别
SELECT @@TRANSACTION_ISOLATION;
设置事务隔离级别
SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }