数据库锁

 

当并发事务同时访问资源时,需要用一种机制来将访问顺序化,以保证数据一致性,锁就是这种机制

 

锁的粒度

  • 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低
  • 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高
  • 页级锁:锁定一页。

 

行锁

  • 共享锁(S锁):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。
    • 也叫做读锁:读锁是共享的,多个客户可以同时读取同一个资源,但不允许其他客户修改
  • 排他锁(X锁):允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁。
    • 也叫做写锁:写锁是排他的,写锁会阻塞其他的写锁和读锁

乐观锁、悲观锁

悲观锁就是通常说的数据库锁机制;

乐观锁是一种思想,具体实现是,表中有一个version字段,第一次读的时候,获取到这个字段。处理完业务逻辑开始更新的时候,需要再次查看该字段的值是否和第一次的一样。如果一样更新,反之拒绝。

update A set Name=lisi,version=version+1 where ID=#{id} and version=#{version}

之所以叫乐观,因为这个模式没有从数据库加锁,等到更新的时候再判断是否可以更新。

 

间隙锁

当我们用范围条件检索数据并请求共享或排他锁时,InnoDB会给符合范围条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录,叫做“间隙(GAP)”。InnoDB也会对这个“间隙”加锁,这种锁机制就是所谓的间隙锁。

MySQL的恢复机制要求:在一个事务未提交前,其他并发事务不能插入满足其锁定条件的任何记录。

all id {0-60}, where id>50, then date id>60 be called Gap, and will add Gap Lock.

 

posted on 2018-10-24 15:58  samuel1  阅读(125)  评论(0编辑  收藏  举报

导航