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

水深无声 2023-07-04 03:29 29阅读 0赞

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

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

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

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

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

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

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

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

发表评论

表情:
评论列表 (有 0 条评论,29人围观)

还没有评论,来说两句吧...

相关阅读

    相关 mysql 共享

    mysql 引擎:MyISAM不支持事务,InnoDB支持事务、行级锁、高并发。 排他锁: 排他锁又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他所并存,如一个事务获取

    相关 共享以及乐观

    共享锁 如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。 排他锁 排他锁(X锁):用于数据修

    相关 MySQL 共享

    共享锁(Share Lock) 共享锁又称读锁,是读取操作创建的锁。其他用户可以并发读取数据,但任何事务都不能对数据进行修改(获取数据上的排他锁), 直到已释放所有共享锁