前言
为什么会有事务的隔离级别,是在多个事务并发的时候会产生以下问题,如脏读、不可从复读、幻读
脏读
现在有事务1和事务2两个,事务2先开始执行,将金额改为800,还未提交,然后事务1进来查询,那么此时查询到的金额就是800,这时事务2开始回滚,那么此时事务1读取到的数据就是未提交的数据,也就是800这个脏数据。
一个事务读取到另一个事务中没有提交的数据,就会在本事务中产生数据不一致的问题,解决方式就是将事务隔离级别设置为读已提交即可!那么未提交的数据就无法获取到!
不可从复读
事务1和事务2,事务1中包含两条查询,事务1先开始执行,执行完第一条SQL后事务2开始执行,事务2中有一个修改,将金额修改为800,然后事务1开始执行第2条SQL,那么此时两条相同的SQL读取到的金额就不是一样的!那么这是不可从复读
一个事务中,多次获取相同的数据,但是读取结果不一样,会在本事务中产生数据不一致的问题,解决方式就是将事务的隔离级别设置为可从复读,也就是确保事务1中多次查询获取到相同的值,即事务1在执行期间禁止其他事务对这个数据进行更新(给数据加行锁)
幻读
一个事务中,多次对数据进行整表数据读取,(统计)但是返回的结果不一样,会在本地事务中产生数据不一致的问题,解决方式是将事务的隔离级别设置为串行化。确保事务1可以多次从一个表中读取到相同的行,在事务1执行期间,禁止其他事务对这个表进行添加、更新、删除操作,可以避免任何并发问题,但性能十分低(表锁)
不可重复读和幻读的区别
不可重复读针对的是一行数据
幻读针对的是整表的数据