如何避免org.hibernate.TransactionException:事务未成功启动
我有办法如何避免org.hibernate.TransactionException:事务未成功启动,hibernate,spring-mvc,Hibernate,Spring Mvc,我有办法 @Transactional public void initCityData(List<StoreDataVO> storeDataVos, City city) throws Exception { Session session = sessionFactory.getCurrentSession(); Transaction txn = session.getTransaction(); for (int i = 0; i < sto
@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");
}
@Transactional
public void initCityData(List storeDataVos,City-City)引发异常{
Session Session=sessionFactory.getCurrentSession();
事务txn=session.getTransaction();
对于(int i=0;i
此方法引发如何避免org.hibernate.TransactionException的异常:事务未成功启动您似乎同时使用声明性和编程性事务划分
如果您使用@Transactional,Spring将为您管理事务,因此您不需要beginTransaction和commit之类的调用。您在这里犯的错误是,您使用了整个方法Transactional by annotation
@Transactional
,因此Spring将自动处理此问题,并执行所有必要的步骤,如bigin end回滚等
现在,您已经在事务中显式声明了一个事务,当您执行txn=session.beginTransaction()时代码>,代码将被中断,并将引发异常,因为由于在方法级别指定的注释,事务已启动
因此,要么删除方法级注释,要么删除方法中的事务。存储区(List storeDataVos)的数量大约为1000。完成此方法需要20分钟。因此,部分提交(如在处理每10个存储后提交)非常重要。我是否应该删除@Transactional,然后再试一次?你可以。您必须决定是管理自己的事务还是让Spring来做。就我个人而言,我会选择Spring。不管怎样,20分钟完成此方法是令人震惊的,间歇提交不会提高其性能。