【数据库锁】乐观锁、悲观锁理解
程序员文章站
2022-03-03 20:03:49
...
乐观锁
乐观锁最简单的实现就是在表中加一个版本号字段如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锁的释放。
产生死锁的条件
- 互斥条件:一个资源每次只能被一个进程使用
- 请求和保持条件:一个进程因请求资源而阻塞时,对已有的资源不释放
- 不剥夺条件:进程已获取的资源,在未使用完之前,不能强行剥夺
- 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系
有助于降低死锁概率
- 按同一顺序访问对象
- 避免事务中的用户交互
- 保持事务简短并在同一批中处理
- 使用低隔离级别
- 使用绑定连接
上一篇: InnoDB行锁是通过给索引上的索引项加锁来实现!
下一篇: 数据库优化