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

参考: 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锁的释放。

产生死锁的条件

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

有助于降低死锁概率

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

你可能感兴趣的:(数据库)