我有一个方法
@Transactional
public void initCityData(List<StoreDataVO> storeDataVos, City city) throws Exception {
Session session = sessionFactory.getCurrentSession();
Transaction txn = session.getTransaction();
for (int i = 0; i < storeDataVos.size(); i++) {
StoreDataVO storeDataVO = storeDataVos.get(i);
processStore(city, storeDataVO);
if (i % 10 == 0) {
txn.commit();
txn = session.beginTransaction();
}
}
txn.commit();
// spring will commit it in the end
session.beginTransaction();
logger.info("Store save done");
}
此方法抛出异常如何避免org.hibernate.TransactionException:事务未成功启动
答案 0 :(得分:0)
您似乎正在使用声明式和程序式事务划分。
如果您使用@Transactional,Spring会为您管理您的交易,因此您不需要诸如beginTransaction和commit之类的调用。
答案 1 :(得分:0)
你在这里做错了的是你有整个方法Transactional by annotation @Transactional
所以Spring会自动处理这个所有必要的步骤,比如bigin end rollback等。
现在您已在事务中明确声明了一个事务,当您执行txn = session.beginTransaction();
时,代码会中断,并且由于在方法级别指定了注释,因此事务已经启动,因此会抛出异常。
因此,您要么删除方法级别注释,要么删除方法中的事务。