Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何避免org.hibernate.TransactionException:事务未成功启动_Hibernate_Spring Mvc - Fatal编程技术网

如何避免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分钟完成此方法是令人震惊的,间歇提交不会提高其性能。