数据库共享锁(读锁)和排他锁(写锁)

为了保持数据的一致性,数据库提供了事务。但是,这只能解决单个会话的问题,并不能解决并发操作下数据的一致性。

并发操作下,数据会出现以下问题:

1、修改丢失
事务A与事务B从数据库中读入同一数据并修改,事务B提交的结果破坏了事务A提交的结果,导致事务A的修改被丢失。

2、脏读
事务A修改某一数据,写回磁盘,期间事务B读取同一数据;事务A由于某种原因被撤销,数据回滚,则B读到的数据与库中真实数据不符。(这个与数据库的事务隔离级别有关,可参考拙作:mysql的4种事务隔离级别

3、不可重复读
事务A读取数据d,期间事务B读取数据并修改,提交;则事务A中的数据与库中真实数据不符。

应对之道是引入锁。
常见的锁有排他锁(写锁)和共享锁(读锁)。

1、共享锁
共享锁的意义在于加了共享锁,其他会话就不能加排他锁,除非共享锁移除或释放。读的时候加上共享锁。注意,共享锁的特点是不一定要显式释放,一个会话A加了共享锁,会话B也可以加共享锁,那么共享锁就转移到了会话B,相当于会话A的共享锁已经释放。锁是只有一把的。

2、排他锁
加上排他锁,其他会话不能再加排他锁,除非显式释放。在修改记录的时候使用,所以也叫写锁。

发布了1111 篇原创文章 · 获赞 337 · 访问量 339万+

猜你喜欢

转载自blog.csdn.net/leftfist/article/details/104214862