MySQL系列(11): 悲观锁 与 乐观锁

  加锁操作是为了保证多事务操作同一数据时可能保持一致性。有 悲观锁乐观锁 两种方式。

  悲观锁 是由数据库引擎提供支持;乐观锁 是常规 SQL 语句版本检测的一种主观理解。

悲观锁

悲观锁:对正在处理的数据可能被其它并发修改持悲观态度,认为数据会被修改造成数据冲突,在处理时将数据进行锁定。具有强烈的独占和排他特性。悲观锁的实现依靠数据库供的锁机制。

1
2
3
4
-- for update加锁,最常用
select * from tb_name where column='xxx' for update;
-- lock in share mode加锁,较少用
select * from table where column='xxx' lock in share mode;

备注:要使用悲观锁,我们必须关闭 mysql 数据库的自动提交属性,因为 MySQL 默认使用 autocommit 模式,也就是说,当你执行一个更新操作后,MySQL 会立刻将结果进行提交。for update必须是事务区块(BEGIN/COMMIT)

乐观锁

乐观锁是相对悲观锁而言,加锁相对更加宽松,乐观锁假设认为数据一般情况下不会造成冲突,只在提交更新时检查数据是否有冲突违返数据完整性。大多使用数据版本(version)来为数据增加一个版本标识。

在基于数据表的版本解决方案中,一般通过为表增加一个version字段,读取数据时,将该字段一同读出,之后更新时对此版本号加一,并判断版本号是否发生改变,如果相同则执行SQL,否则说明该数据已被改变。

1
2
3
update tb_name 
set status=#{status},version=version+1
where id=#{id} and version=#{version}

更多参见:MySQL系列(十):MySQL InnoDB 锁机制

作者

光星

发布于

2019-02-22

更新于

2023-03-06

许可协议

评论