数据库事物并发可能出现的问题

可以先看:事物隔离级别
1、脏读
A事务读取B事务尚未提交的更改数据,并在这个数据的基础上进行操作,这时候如果事务B回滚,那么A事务读到的数据是不被承认的。

2、不可重复读
指A事务读取了B事务已经提交的更改数据。假如A在取款事务的过程中,B往该账户转账100,A两次读取的余额发生不一致。

3、幻读
A事务读取B事务提交的新增数据,会引发幻读问题。幻读一般发生在计算统计数据的事务中,例如银行系统在同一个事务中两次统计存款账户的总金额,在两次统计中,刚好新增了一个存款账户,存入了100,这时候两次统计的总金额不一致。

不可重复读和幻读的区别是:不可重复读是指读到了已经提交的事务的更改数据(修改或删除),幻读是指读到了其他已经提交事务的新增数据。不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。

对于这两种问题解决采用不同的办法
防止读到更改数据,只需对操作的数据添加行级锁,防止操作中的数据发生变化;
防止读到新增数据,往往需要添加表级锁,将整张表锁定,防止新增数据(oracle采用多版本数据的方式实现)。

4、第一类丢失更新
A事务撤销时,把已经提交的B事务的更新数据覆盖了。在这里插入图片描述
5、第二类丢失更新
A事务提交,覆盖B事务已经提交的数据,造成B事务所做的操作丢失。
在这里插入图片描述
为了解决上述问题,数据库通过锁机制解决并发访问的问题。
根据锁定对象不同:分为行级锁和表级锁;
根据并发事务锁定的关系上看:分为共享锁定和独占锁定,共享锁定会防止独占锁定但允许其他的共享锁定。而独占锁定既防止共享锁定也防止其他独占锁定。
为了更改数据,数据库必须在进行更改的行上施加行独占锁定,insert、update、delete和selsct for update语句都会隐式采用必要的行锁定。

但是直接使用锁机制管理是很复杂的,基于锁机制,数据库给用户提供了不同的事务隔离级别,只要设置了事务隔离级别,数据库就会分析事务中的sql语句然后自动选择合适的锁。
不同的隔离级别对并发问题的解决情况如图:
在这里插入图片描述
原文:https://blog.csdn.net/starlh35/article/details/76445267

猜你喜欢

转载自blog.csdn.net/wodemale/article/details/89538245