最近项目中使用事务Transactional出现了两个问题,简单记录一下
1.使用java reentrantLock + Transactional 时,因为锁的粒度较小,造成锁释放过后,修改的数据并未提交,下一个获取到锁的线程并未查询到数据,再次新增了一条
private final ReentrantLock lock = new ReentrantLock(true);
@Transactional(rollbackFor = Exception.class)
@Override
public void add(Long param) {
/*获取锁*/
lock.lock();
try {
/*根据条件查询*/
Object obj = mapper.selectByParam(param);
/*不存在,则新增*/
if (Objects.isNull(obj)) {
obj = new Object();
obj.setParam(param);
mapper.insert(obj);
} else {
/*修改业务*/
}
} catch (Exception e) {
throw e;
} finally {
lock.unlock();
}
/*其他业务*/
}
因为提前释放了锁,当期事务并未提交,在并发情况下,会插入多条属性相同的数据。
修改的方案,具体根据业务需求来
我这里直接缩小了事务的范围