数据库并发事务存在的问题(脏读、不可重复读、幻读等)
来源:互联网 发布:淘宝菲戈体育 编辑:程序博客网 时间:2024/05/16 18:43
一个数据库可能拥有多个访问客户端,这些客户端并发访问数据库时,若没有采取必要的隔离措施,存在以下问题,这些问题分为5类,包括3类数据读问题:脏读、不可重复读和幻读。两类数据更新问题:第一类丢失更新、第二类丢失更新。
1.脏读
A事务读取B事务尚未提交的更改数据,并在这个数据的基础上进行操作,这时候如果事务B回滚,那么A事务读到的数据是不被承认的。例如常见的取款事务和转账事务:
2.不可重复读
不可重复读是指A事务读取了B事务已经提交的更改数据。假如A在取款事务的过程中,B往该账户转账100,A两次读取的余额发生不一致。
3.幻读
A事务读取B事务提交的新增数据,会引发幻读问题。幻读一般发生在计算统计数据的事务中,例如银行系统在同一个事务中两次统计存款账户的总金额,在两次统计中,刚好新增了一个存款账户,存入了100,这时候两次统计的总金额不一致。
注意:不可重复读和幻读的区别是:前者是指读到了已经提交的事务的更改数据(修改或删除),后者是指读到了其他已经提交事务的新增数据。对于这两种问题解决采用不同的办法,防止读到更改数据,只需对操作的数据添加行级锁,防止操作中的数据发生变化;二防止读到新增数据,往往需要添加表级锁,将整张表锁定,防止新增数据(oracle采用多版本数据的方式实现)。
4.第一类丢失更新
A事务撤销时,把已经提交的B事务的更新数据覆盖了。例如:
这时候取款事务A撤销事务,余额恢复为1000,这就丢失了更新。
5.第二类丢失更新
A事务覆盖B事务已经提交的数据,造成B事务所做的操作丢失
为了解决上述问题,数据库通过锁机制解决并发访问的问题。根据锁定对象不同:分为行级锁和表级锁;根据并发事务锁定的关系上看:分为共享锁定和独占锁定,共享锁定会防止独占锁定但允许其他的共享锁定。而独占锁定既防止共享锁定也防止其他独占锁定。为了更改数据,数据库必须在进行更改的行上施加行独占锁定,insert、update、delete和selsct for update语句都会隐式采用必要的行锁定。
但是直接使用锁机制管理是很复杂的,基于锁机制,数据库给用户提供了不同的事务隔离级别,只要设置了事务隔离级别,数据库就会分析事务中的sql语句然后自动选择合适的锁。
不同的隔离级别对并发问题的解决情况如图:
注意:事务的隔离级别和数据库并发性是成反比的,隔离级别越高,并发性越低。
- 数据库并发事务存在的问题(脏读、不可重复读、幻读等)
- 数据库并发访问、事务与锁、脏读、不可重复读、幻影读
- 数据库的事务、脏读、不可重复读和幻读 以及隔离机制
- 数据库事务,脏读、不可重复读、幻读
- mysql事务隔离级别以及有问题的读取(脏读,不可重复读,幻象读)
- mysql事务隔离级别以及有问题的读取(脏读,不可重复读,幻象读)
- mysql事务隔离级别以及有问题的读取(脏读,不可重复读,幻象读)
- mysql事务隔离级别以及有问题的读取(脏读,不可重复读,幻象读)
- 数据库 脏读、不可重复读和幻读的区别
- 事务和线程的区别还有事务并发执行引起的四个问题:丢失修改、脏读、不可重复读,幻读
- 事务(脏读,不可重复读,虚读)
- 事务(脏读,不可重复读,虚读)
- 事务相关、不可重复读与幻读的区别
- 事务的 不可重复读
- 脏读、幻读和不可重复读 + 事务隔离级别
- 脏读、幻读和不可重复读 + 事务隔离级别
- 脏读,不可重复读,幻读与事务隔离
- 数据库问题原因详解(脏读、不可重复读、幻读)
- mysql定时任务demo
- 存储过程游标使用
- [iOS 仿QQ消息推送框
- libcurl库使用一小下
- alembic 使用
- 数据库并发事务存在的问题(脏读、不可重复读、幻读等)
- 封装继承多态_继承重写重载
- 使用自己的数据训练Faster-RCNN
- html属性大全。
- codeforce-243C:Colorado Potato Beetle(BFS+离散化+暴力)
- RTMP协议在蓝牙连接中传输数据的运用
- TF-IDF模型的概率解释
- html空格
- zoj1109-Language of FatMouse 字典树