欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【数据库锁】乐观锁、悲观锁理解

程序员文章站 2022-03-03 20:03:49
...

参考: MySQL/InnoDB中,乐观锁、悲观锁、共享锁、排它锁、行锁、表锁、死锁概念的理解

乐观锁

乐观锁最简单的实现就是在表中加一个版本号字段如version,每次新增设置为1,更新的时候检查版本号是否一致,如果不一致就更新失败。版本一致才能更新,然后将版本号+1。

悲观锁

首先数据库需要关闭自动提交功能,或者说是在jdbc中将自动提交设置成false。

共享锁

共享锁是当有sql进行查询的时候加上共享锁,那么其他对查询结果有修改的sql都不能执行,必须等查询sql结束后释放锁才可以。如果是查询sql,那么不会受到影响,它也会获取共享锁。

普通sql:

select id,code,name from t_bd_person

共享锁sql:

select id,code,name from t_bd_person lock in share mode

所以关键就是在sql后加上一个关键语句 lock in share mode

排它锁

排它锁会排斥其他的排它锁和共享锁,所以当一句sql对数据加上排它锁的时候,其他sql不能对这数据进行读写。

普通sql:

update t_bd_person set code='faker',name='LXH' where id=1

排它锁sql:

update t_bd_person set code='faker',name='LXH' where id=1 for update

所以关键就是在sql后加上一个关键语句 for update

行锁和表锁

行锁和表锁是锁范围的限定,它们也是有共享锁和排它锁。至于sql什么时候会锁定行,什么时候会锁定整张表,是需要索引实现的。最简单的就是如果sql使用到了索引,那么这句sql就是行锁,否则sql会获取表锁。

死锁

死锁的出现是因为两个事务相互等待,事务A持有数据A的锁等待数据B锁的释放,事务B持有数据B的锁等待数据A锁的释放。

产生死锁的条件

  • 互斥条件:一个资源每次只能被一个进程使用
  • 请求和保持条件:一个进程因请求资源而阻塞时,对已有的资源不释放
  • 不剥夺条件:进程已获取的资源,在未使用完之前,不能强行剥夺
  • 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系

有助于降低死锁概率

  • 按同一顺序访问对象
  • 避免事务中的用户交互
  • 保持事务简短并在同一批中处理
  • 使用低隔离级别
  • 使用绑定连接
相关标签: 数据库锁