项目需求,在审核的时候,会有多个管理员进行审核。
但是如果多个管理员审核的时候会出现多个人修改一条数据,从而产生脏数据。
直接上代码:
java
public class ServiceImpl implements IService {
// 全局静态变量,用于存储锁的钥匙
private static final ConcurrentHashMap<String, Object> lockMap = new ConcurrentHashMap<>();
/**
* 审核
*/
@Override
@Transactional
public Boolean state(StateBo bo) {
// 这里我用审核表的id作为钥匙
if (lockMap.containsKey(String.valueOf(bo.getId()))) {
throw new ServiceException("该记录正在审核中!", HttpStatus.HTTP_BAD_REQUEST);
}
// 封装一个密钥的对象
Object lock = lockMap.computeIfAbsent(String.valueOf(bo.getId()), k -> new Object());
synchronized (lock) {
// DOTO 业务逻辑
// 输出当前容器中的锁
lockMap.forEach((k, v) -> System.out.println("当前键:"+k+"当前值:"+v));
}
return true;
}
/**
* 移除锁
* @param key
*/
@Override
public void removeLockMap(String key) {
lockMap.remove(key);
}
}
这里需要注意的是,如果你的方法有事务,你的锁就要将事务内的所有代码都要圈起来。
当然为了效率是最好是锁的代码越少越好!
