数据库锁和读的概念和处理
如下概念是 指数据库操作 的几种现象 ,一般是由于没处理好 并发事务导致的现象
脏读:
A正在执行事务已修改数据了 还没提交,而事务B 读到这数据是修改后果的数据,
A事务把订单金额5000 修改成8000 还未提交,
B事务读取该订单金额 显示的是 8000,所以称脏读
不可重复读:
A事务 第一次 读取订单金额 8000 ,还没修改 还没提交该事务,此时事务B 修改了该订单金额 5000 并提交了,那A事务 再读取该订单金额显示为 5000,所以两次读取不一样造成错误
幻读:
A读取 客户有10行数据,此时B对该客户 插入或者 删除一条记录,导致 A再读取时 数据条数 不一致
提醒
不可重复读的重点是修改:
同样的条件,你读取过的数据,再次读取出来发现值不一样了
幻读的重点在于新增或者删除:
同样的条件,第 1 次和第 2 次读出来的记录数不一样
第一类丢失更新
A事务撤销时,把已经提交的B事务的更新数据覆盖了。例如:
这时候取款事务A撤销事务,余额恢复为1000,这就丢失了更新。
第二类丢失更新
A事务覆盖B事务已经提交的数据,造成B事务所做的操作丢失
如何解决
为了解决上述问题,数据库通过锁机制解决并发访问的问题。根据锁定对象不同:分为行级锁和表级锁;根据并发事务锁定的关系上看:分为共享锁定和独占锁定,共享锁定会防止独占锁定但允许其他的共享锁定。而独占锁定既防止共享锁定也防止其他独占锁定。为了更改数据,数据库必须在进行更改的行上施加行独占锁定,insert、update、delete和selsct for update语句都会隐式采用必要的行锁定。
但是直接使用锁机制管理是很复杂的,基于锁机制,数据库给用户提供了不同的事务隔离级别,只要设置了事务隔离级别,数据库就会分析事务中的sql语句然后自动选择合适的锁。
不同的隔离级别对并发问题的解决情况如图:
注意:事务的隔离级别和数据库并发性是成反比的,隔离级别越高,并发性越低