mysql的事务隔离级别
mysql数据库事务隔离级别分为四个不同层次:
1.读未提交:一个事务能够读取其他事务未提交的修改数据,这是最低的隔离水平,允许出现脏读;
脏读:读到了别的事务回滚前的脏数据;
脏读场景:

2.读已提交:一个事务能够读取其他事务已经提交的修改的数据,脏读不会出现;但是隔离级别比较低,允许出现不可重复读和幻读;
不可重复读:事务A首先读取了一条数据,然后执行逻辑的时候,事务B将这条数据改变了,然后事务A再次读取的时候,发现数据不匹配了,就是所谓的不可重复读了(针对的是修改操作)。
不可重复读的场景:

3.可重复读:除了保证已提交读级别外,它还保证任何读取的数据都不能更改,如果事务再次读取相同的数据,它将找到原先读取的数据,并且保持不变,可供阅读。可重复读隔离级别比较高,允许出现幻读;这也是mysql InnoDB引擎的默认隔离级别,但是和一些其他的数据库不同,可以简单的认为mysql在可重复读级别不会出现幻读;
幻读:事务A首先根据条件索引得到N条数据,然后事务B改变了这N条数据之外的M条或者增添了M条符合事务A搜索条件的数据,导致事务A再次搜索发现有N+M条数据了,就产生了幻读;
幻读的场景:

4.串行化:并发事务之间是串行化的,通常意味着读取需要共享读锁,更新需要获取排他写锁,这是最高的隔离级别;
不可重复读和幻读有什么区别?
1.不可重复读是读取了其他事务更改的数据,针对update或delete操作,解决办法:使用行级锁,锁定改行,事务A多次读取操作完成后才释放该锁,这个时候才允许其他事务更改刚才的数据;
2.幻读是读取了其他事务新增的数据,针对insert操作,解决办法:使用表级锁,锁定整张表,事务A多次读取数据总量之后才释放该锁,这个时候才允许其他事务新增数据;