一、什么是事务?
事务是一次或多次对数据进行DML(增、删、改)操作的执行单元
二、事务的特性?
ACID
1、原子性:
一个事务中所有对数据库的DML操作,作为一次对数据的修改,要么所有的DML操作成功,要么所有的DML操作失败
2、一致性:
一个事务对数据的实际操作和业务逻辑是一致的;经典例子:银行转账(A转给B200元,A的账户少200,B的账户多200)
3、隔离性:
在多个事务并发执行的时候,事务与事务之间是相互隔离,不产生影响的
4、持久性:
一个事务的提交,对数据的影响是永久的;这里分为两种情况:
(1)事务提交后,数据直接从内存更新到磁盘中,实现永久保存
(2)事务提交后,数据更改的详细从内存保存到磁盘中(redo log和bin log)
三、当事物之间没有隔离性可能存在的问题
1、修改覆盖:
A事务和B事务读取相同数据,并进行修改,A事务先提交B事务再提交,然后A事务的操作被覆盖
解决修改覆盖问题是使用排他锁
悲观锁、乐观锁;共享锁,排他锁https://www.jianshu.com/p/d2ac26ca6525
2、脏读:
A事务中对同一部分数据进行前后两次读取;在A事务第一次读取之前B事务对数据进行修改,在A事务第一、二次读取之间B事务对修改的数据进行回滚操作;事务A第一次和第二次的读取数据是不同的(一个事务读取了另一个事务未提交的操作修改的数据)
3、不可重复读
一个事务前后两次读取相同数据,另一个事务在这期间提交了对数据的修改,导致前一个事务两次的读取结果不一致
解决不可重复读需要锁住所有满足条件数据的行
4、幻读
一个事务前后两次读取相同条件下的数据,另一个事务在这期间提交了对数据的增加或者删除,导致前一个事务两次读取的结果不一致
解决幻读需要锁住整张表
不可重复读和幻读不同之处在于一个是对数据的修改,另一个是对数据的增加或者删除
三、Mysql的事务隔离级别
1、读未提交 隔离问题都解决不了
2、读已提交 可以解决脏读
3、可重复读 可以解决脏读、不可重复读 MySQL默认隔离级别
非常好的一篇可重复读深入解读的文章https://blog.youkuaiyun.com/qq_32573109/article/details/98610368
MySQL的MVCC及实现原理https://www.cnblogs.com/xuwc/p/13873611.html
4、串行读 可以解决脏读、不可重复读、幻读