0%

MySQL 的乐观锁和悲观锁

乐观锁

乐观锁是假设不冲突,在提交的时候判断是否冲突。

1
2
3
4
#先查出version
select id, version from tbl_name where id = 100;
#更新时保证 version 没有发生变化
update tbl_name set ..., version = version + 1 where id = 100 and version = last_version;

悲观锁

悲观锁是假设一定会发生冲突,取出数据时就不允许别的操作者取出该条数据。

1
2
select id from tbl_name where id = 100 for update
update tbl_name set ... where id = 100;

前者能够避免死锁,但是如果必须完成此次更新则需要多次尝试。后者必须等待之前操作完成才能完成。