• 异常:no transaction is in progress


    转载请注明出处:

      在使用  @Scheduled 注解创建了一个定时任务,并通过定时任务不断向mysql写入数据,写入数据的方式是通过 jpa 的方式,在代码运行的过程中出现错误:no transaction is in progress。

      以下是异常堆栈:

     

      原因分析:

        该异常表明没有事务正在进行,导致无法访问数据持久化上下文。这个问题通常是由于事务管理器未正确配置或未正确应用到代码中引起的。

      解决方案:

        尝试了将@Scheduled和调用的service进行拆分,或是添加@Trasactional注解,以及修改定时任务的触发方式,一直没有生效,但是通过写controller,通过controller调用service中的方法,是可以调用成功,且数据写入成功。

        目的要通过定时任务触发进行写入数据时,一直事务不生效。

        最终解决方式,使用手动创建事务和提交事务,这时通过定时任务写数据便可以写成功。

        手动事务的关键代码:

    复制代码
    @Service
    public class MyService {
        
        @Autowired
        private EntityManagerFactory entityManagerFactory;
        
        @Transactional  // 添加事务注解
        public void saveData(Object data) {
            EntityManager entityManager = entityManagerFactory.createEntityManager();
            EntityTransaction transaction = entityManager.getTransaction();
            
            try {
                transaction.begin();  // 开始事务
                
                entityManager.persist(data);  // 执行持久化操作
                
                transaction.commit();  // 提交事务
            } catch (Exception e) {
                if (transaction != null && transaction.isActive()) {
                    transaction.rollback();  // 回滚事务
                }
                throw e;
            } finally {
                entityManager.close();  // 关闭实体管理器
            }
        }
    }
    复制代码

     

  • 相关阅读:
    LM2903VQPWRQ1比较器 LM73C0QDDCRQ1传感器的中文资料
    LIEF:修改安卓.so后报 dlopen failed:has invalid shdr offset/size
    js的小题
    VSCode新建Vue项目
    MongoDB-介绍与安装部署
    Vue2与Vue3:深度剖析核心差异与升级亮点
    SqlServer 系统表
    云原生基础知识:容器技术的历史
    京东获得JD商品详情 API 返回值说明
    初识React -- 一篇文章让你会用react写东西
  • 原文地址:https://www.cnblogs.com/zjdxr-up/p/17733470.html