乐观锁和悲观锁

doMore 787 2019-10-24

悲观锁

也就是悲观的锁,每次操作数据时,都要提前锁定数据,防止别的事务修改,也就是很悲观!在数据库操作上,一般在要修改的数据的时候提前用 select ... from table for update 来锁定需要修改的数据,这样只有当前事务能够修改数据,其他事务会挂起。悲观锁在并发不高的时候都会用到,用起来比较简单,并发高不适用,会影响数据库性能,建议用分布式锁或者乐观锁来实现。

乐观锁

也就是乐观的锁了,知道 Java 中 CAS 算法的人应该清楚,这就是乐观锁的实现。每次修改数据,不会锁定数据,只会拿取到的旧数据与原数据对比,数据一致就更新为新数据,不一致就反复对比直到成功为止。在数据库上面也有乐观锁的应用,一般会往表中加一个版本号的字段,每次更新前用取到的版本号和原来的版本号做对比,一致就更新数据,不一致就反复或者放弃更新。如:update table set money = money + 999 where version= 1.0,这样就只有一个事务能更新成功了。