数据库的隔离性与隔离级别以及隔离级别产生的影响
隔离性:个人理解是要保证两个同时发生的事务之间不会感受到对方的存在,不会相互影响。和其他三个原则(原子性、一致性、持久性)是数据操作需要注意的原则。为了满足隔离性,辅助的提出了4个隔离级别,当然约束越严格效率就越低。
隔离级别:
1)read uncommitted 读取未提交的数据,即A事务可以看到其他事务已经加减但是未提交的数据。
A事务可以读到B事务已经加减的数据但如果B事务之后失败发生回滚 A事务就读到了被回滚的脏数据 所以网上常叫“脏读”
2)read committed 读取已提交的数据 即A事务只能看到其他事务提交后的数据
A事务不会读取到B事务中已经加减但是事务未提交的数据,这样即使B回滚A也不会读到脏的数据,数据起码是对的,
但B事务在A提交前提交,A事务需要重复读两次时,第一次读到事务B未提交之前的数据第二次读到了B已提交的数据,就造成了两次读到的数据不一致,从而有可能影响到A的业务。
3)repeatable read 可重复读
A事务读取数据后B事务加减数据并提交事务,A事务再次读取还是会读到B事务未加减前的值,也就是A事务在未提交之前会无视B事务对数据的影响,只有当A事务提交之后才能看到B事务对数据的修改。
4)serializable 可串行化
强制排序事务使事务不能交叉更新同一条数据。
就是在行上使用共享锁,防止脏读、重复读、幻读发生,极端情况下会造成大量的超时和锁竞争。
自问自答:
1)重复读和幻读的区别是什么?
重复读是指读到了B已提交的数据和读到B未提交的数据不一致。
可重复读级别为了解决上面的重复读造成的数据不一致性,而伪造了一致性,导致最后操作时追加同一条数据会产生问题。
经过实践:发现如果B事务插入了一个主键为8的数据并提交,A查询后还是看不到8(前提是A在B事务提交前查询过一次)A插入数据8会失败,查询还是看不到。A直接去更新8会更新成功,而且8心想你既然已发现我了我就出来吧,于是A再查询就可以看到了。
对一条B插入的数据在B未提交前A插入同样的数据会挂起。
2)幻读会产生什么问题?
由于无法读到其他事务的更新可能在追加操作时会发生数据不一致性。
3)什么是数据库的共享锁?
共享锁又叫写锁。
明天回答。
总结自:https://www.cnblogs.com/snsdzjlz320/p/5761387.html 少数几个写的比较清楚的博文