侧边栏壁纸
博主头像
实习两年半

基础不牢,地动山摇。

  • 累计撰写 43 篇文章
  • 累计创建 40 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

在事务中使用锁无效!!!

实习两年半
2022-11-30 / 0 评论 / 0 点赞 / 453 阅读 / 300 字
温馨提示:
本文最后更新于 2022-12-07,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

问题描述

   离了个大谱,我在一个使用事务注解的方法中使用线程池调用方法处理业务。就线程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);
        }
    }
0

评论区