问题描述
离了个大谱,我在一个使用事务注解的方法中使用线程池调用方法处理业务。就线程A中开启线程B,现在有个方法C,线程AB都需要调用方法C。方法C中判断数据是否在数据库中存储过,如果存在就更新。考虑到线程同步问题,我还直接加了一个synchronized 。
但是在正式环境中,经常出现保存两份数据的情况。最后发现方法A被事务注解进行修改过。在事务中使用锁无效!!! 最后我通过编程式事务,在线程A方法中提交事务后再执行现场B。
编程式事务
@Resource
private PlatformTransactionManager transactionManager;
public void A(){
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);//新发起一个事务
TransactionStatus defStatus = transactionManager.getTransaction(def);// 获得事务状态
try{
// 方法A中业务逻辑
// 业务代码结束,提交事务
transactionManager.commit(defStatus);// 手动提交事务
// 线程池调用方法A
} catch (Exception e) {
e.printStackTrace();
log.info("数据消费异常,事务将回滚");
transactionManager.rollback(defStatus);
}
}
评论区