几种实现方式
- 基于数据库实现分布式锁
- 基于缓存(Redis,memcached,tair)实现分布式锁
- 基于Zookeeper实现分布式锁
分布式锁实现要求:
- 一种方法在同一时间只能被一个线程调用
- 可重入性(线程可以进入已经获取自身已获得锁同步的代码块)
- 获取锁和释放锁的性能要好
基于数据库实现分布式锁
基于数据库乐观锁(版本号)
即基于版本号,在查询资源信息的时候带出版本号(select阶段),更新的时候版本号加1(update阶段),更新的时候对版本号进行校验,如果与查询时一致,则更新成功;如果不同,则更新失败;
存在的问题:基于版本号的解决方案不支持对多张表的操作
基于数据库悲观锁(排他锁)
- sql方式:
public boolean lock(){
connection.setAutoCommit(false)
while(true){
try{
result = select * from methodLock where method_name=xxx for update;
if(result==null){
return true;
}
}catch(Exception e){
}
sleep(1000);
}
return false;
}
获得排他锁的线程即获得锁,如果获取失败则一直阻塞。
释放锁:
public void unlock(){
connection.commit();
}
- 事务:
将所有数据库操作放在一个事务里,二段式、三段式提交
网友评论