乐观锁和悲观锁

来源:互联网 发布:理正软件 编辑:程序博客网 时间:2024/06/08 20:56

乐观锁:是对外界的一种认识,认为外界的并发是乐观的,它可以允许所有的线程进行对数据的更新,但是它只有在修改数据后,提交数据的时候,判断是否并发被修改过。然后交给用户去处理,是失败还是成功。乐观锁对于数据的脏读没有办法避免。

悲观锁:认为外界的并发是悲观的,它保证当一个事务占用这个处理过程之后,其他的并发事务处理,不允许进入修改。

乐观锁的实现方式:
1. 使用版本号。
一个客户端修改数据,当数据提交时,发现这个数据的版本已经不是原来查询的数据版本,则修改不成功;如果版本一致,则提交此修改,并版本加1。
select *, version from table1 where condition;
update tables set column, version = #{version} + 1 where condition and version = #{version};
2. 使用timestamp标记此数据。

悲观锁的实现方式:
采用数据库自带的事务排他锁。当事务没有提交时,其他事务处于等待状态,直到提交之后,释放排它锁。所以对于mysql数据库来说要把全局变量autoCommit关闭。
begin;
select * from table1 for update;
commit;