没有对事务进行隔离时会发生脏读、幻读、不可重复读等危害
一.脏读
读取了未提交的数据,针对单笔数据,需进行读提交(Read Committed)才能解决。
例:已知两个事务A和B,B读取了已经被A更新但还没有被提交的数据,A发现出了错误,A回滚事务,B读取的数据就是脏数据。
二.不可重复读
进行了读取,分别读取了事务提交前后不同的数据,重点在于修改和删除,针对单笔数据,需进行可重复读(Repeatable read)才能解决。
例:已知两个事务A和B,同时去取出一张银行卡里面的钱,A先到银行,将所有的钱取出来,并提交了事物,B后到,没法再重复取钱。
三.幻读
进行了读取,分别读取了不同的数据,重点在于新增,针对多笔数据,需进行Serializable 序列化才能解决。
例: 已知有两个事务A和B,A从一个表中读取了数据,然后B在该表中插入了一些新数据,导致A再次读取(多次读取)同一个表, 就会多出几行。
不可重复读和幻读的区别
1.相同点
两者都是对数据进行了两次查询
2.不同点
1.从控制的角度前者只需要锁住满足条件的记录,后者要锁住满足条件及其相近的记录
2.避免不可重复读需要锁行,避免幻读则需要锁表。
3.不可重复读重点在于update和delete,而幻读的重点在于insert。
4.所以说不可重复读和幻读最大的区别,就在于如何通过锁机制来解决他们产生的问题。
可重复读
sql第一次读取到数据后,就将这些数据加锁,其它事务无法修改这些数据,就可以实现可重复读了。