多线程-java锁机制-乐观锁与悲观锁
场景
当多个请求同时操作数据库时,首先将订单状态改为已支付,在金额加上 200 ,再同时并发场景查询条件下,会造成重复通知(重读)。
悲观锁
定义:
悲观锁悲观的认为每一次操作都会造成更新丢失问题,在每次查询时加上排他锁。
每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会 block 直到它拿到锁。传统的关系型数据库里边就用到很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在操作之前先上锁。
代码操作
select * from xxx for update;
悲观锁的缺点
只能保证一个连接进行操作,效率低。
乐观锁
定义:
乐观锁会乐观的认为每次查询都不会造成更新丢失,利用版本字段控制(CAS无锁机制)。
在数据库相应的表中增加一个版本号的字段 version + 影像行数。
代码操作
乐观锁与悲观锁的区别
如果查询量小,可以使用悲观锁。
乐观锁使用版本操作