MySQL系列(11): 悲观锁 与 乐观锁
加锁操作是为了保证多事务操作同一数据时可能保持一致性。有 悲观锁 和 乐观锁 两种方式。
悲观锁 是由数据库引擎提供支持;乐观锁 是常规 SQL 语句版本检测的一种主观理解。
悲观锁
悲观锁:对正在处理的数据可能被其它并发修改持悲观态度,认为数据会被修改造成数据冲突,在处理时将数据进行锁定。具有强烈的独占和排他特性。悲观锁的实现依靠数据库供的锁机制。
1 | -- for update加锁,最常用 |
备注:要使用悲观锁,我们必须关闭 mysql 数据库的自动提交属性,因为 MySQL 默认使用 autocommit
模式,也就是说,当你执行一个更新操作后,MySQL 会立刻将结果进行提交。for update
必须是事务区块(BEGIN/COMMIT)
。
乐观锁
乐观锁是相对悲观锁而言,加锁相对更加宽松,乐观锁假设认为数据一般情况下不会造成冲突,只在提交更新时检查数据是否有冲突违返数据完整性。大多使用数据版本(version
)来为数据增加一个版本标识。
在基于数据表的版本解决方案中,一般通过为表增加一个version
字段,读取数据时,将该字段一同读出,之后更新时对此版本号加一,并判断版本号是否发生改变,如果相同则执行SQL
,否则说明该数据已被改变。
1 | update tb_name |
MySQL系列(11): 悲观锁 与 乐观锁
http://blog.gxitsky.com/2019/02/22/MySQL-11-lock-version-for-update/