并发事务的问题:

  • 第一类更新丢失
    • 有A,B两个事务,B发生在A事务的过程中
    • B提交事务后A撤销了事务,将记录恢复到A的开始状态,造成B的更新丢失
  • 第二类更新丢失
    • 有A,B两个事务,B发生在A事务的过程中
    • B提交事务后A也提交了事务,将记录更新到A提交后的状态,造成B的更新丢失
  • 脏读
    • 有A,B两个事务,A在事务开始时读到了B更新但是没有提交的数据

//任何数据库都避免脏读!也就是说如果存在任意未提交的更新事务,那么不允许“读”操作

  • 不可重复读
    • 有A,B两个事务,A在开始时读了一次数据,在结束之前,B修改了数据并且提交
    • A在结束前又读了一次数据,两次值不同
  • 幻读
    • 有A,B两个事务,A在开始时读了一次数据(多数是统计的数据),在结束之前,B插入了数据并且提交
    • A在结束前又读了一次数据,两次值不同

事务隔离级别(有问题)
先理清几个事务状态
有A,B两个事务,当A开始事务时,
1.发现B刚开始修改事务,还没有修改
2.发现 B正在进行修改事务,已经修改了数据,但还未提交(有撤销的可能)
//2选项是脏读情况,无论如何都不能发生
3.发现B提交了修改事务
4.发现B刚开始插入事务,还没有插入
5.发现B正在进行插入事务,已经插入了数据,但还未提交(有撤销的可能)
6.发现B提交了修改事务

  • SERIALIZABLE(串行化)
    • 事务串行运行,两个事务不能同时访问同一个数据
  • REPEATABLE READ(可重复读)
    • 若B是修改事务,那么A第一次读数据必须在3的情况下(也就是说1的情况下不允许读)
    • 若B是插入,那么A第一次读数据可以在4或者6的情况下
  • READ COMMITTED(读已提交数据)
    • 若B是修改,那么A第一次读数据可以在1或者3
    • 若B是插入,那么A第一次读数据可以在4或者6
  • READ UNCOMMITTED(读未提交数据)
    • 若B是修改,那么A第一次读数据可以在1或者3
    • 若B是插入,那么A第一次读数据可以在4或者5或者6(所有情况)

结论
4bde87f4-9a35-4bb4-bdd3-cd396fb90b2a.png