数据库并发访问
当多个事务同时对数据库进行操作时,就会产生一些并发现象,按严重程度由高到低列举如下:
(假设有T1和T2两个数据库事务)
丢失更新:
当T1和T2同时对一份数据进行更新的时候,T1先执行了更新但未提交,此时T2又进行了更新,然后T1执行了提交,T2执行提交。此时T1所做的所有操作均已丢失。脏读:
T1更新了一条数据但未提交,T2对这条数据执行了查询,此时T2可以看到T1未提交的更新。但此时T1突然回滚了,所有更新都失效,那么T2获取的就全部都是脏数据(不存在的数据)。不可重复读:
T1对某条件范围内的数据执行查询,T2此时对同样条件范围的数据执行了更新操作,此时T1再次执行相同的查询,那么由于T2的操作导致T1看到的数据与上一次出现了不同。T1无法在同一事务中查看同一份数据(允许更新)。幻象读:
T1对某条件范围内的数据执行查询,T2此时对同样条件范围的数据执行了插入操作,此时T1再次执行相同的查询,那么由于T2的操作导致T1看到的数据比上一次多出了一条。T1无法在同一事务中查看同一份数
据(允许插入)。
数据库的事务隔离级别
- 读取未提交
不允许:丢失更新
允许:脏读、不可重复读、幻象读 读取已提交
不允许:丢失更新、脏读
允许:不可重复读、幻象读可重复读:
不允许:丢失更新、脏读、不可重复读
允许:幻象读串行化:
不允许:丢失更新、脏读、不可重复读、幻象读
允许:(串行化是最高事务隔离级别,强制所有的事务串行执行。)