前言:java 中有许多锁,可以丰富的实现我们需要的各种业务场景,总结如下:
1.悲观锁
实现方式:在该事务的第一个查询sql的最后添加 for update;
应用场景:写入数据量大,读取数据量少的情况;
锁级别:where 后明确指定主键,row lock;
where后明确指定主键,查询数据为null,没有锁;
where后没有指定主键,table lock;
2.乐观锁
实现方式:在该条数据中加version字段,记录操作的次数,当前用户获取version,然后将操作数据及version+1 保存到数据库时,发现version不为原值,取消本次操作,(即,谁快,谁优先操作);
应用场景:读取数据量大,写入数据量少的情况;
锁级别:row lock;
3.分布式锁
实现方式:
redis、zoomkeeper、数据库都能够实现,这里推荐使用redis分布式锁;
redis分布式锁
具体实现:https://blog.csdn.net/leinminna/article/details/101155733
应用场景:争对跨系统、网络异常导致的数据不一致问题
锁级别:锁的粒度不同而不同,可以自由调节,可以是rowLock,也可以式table lock,也可以是某个状态的锁;
redis分布式锁,也是一种乐观锁;