在使用 @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(); // 关闭实体管理器
}
}
}