Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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
Spring 弹簧&x2B;休眠如何防止回滚_Spring_Hibernate_Transactions - Fatal编程技术网

Spring 弹簧&x2B;休眠如何防止回滚

Spring 弹簧&x2B;休眠如何防止回滚,spring,hibernate,transactions,Spring,Hibernate,Transactions,我有一个使用此方法的代码块: @Transactional(noRollbackFor=Exception.class) public synchronized Object saveData(){ //... dao.insert(entity); //... } 我的dao类被标记为ad事务类 @Transactional public class Dao { //... public <T> void insert(T obj) throw

我有一个使用此方法的代码块:

@Transactional(noRollbackFor=Exception.class)
public synchronized Object saveData(){
    //...
    dao.insert(entity);
    //...
}
我的dao类被标记为ad事务类

@Transactional
public class Dao {
   //...
   public <T> void insert(T obj) throws Exception {
    getSession().saveOrUpdate(obj);
   }
}

为什么最后我发现一个事务回滚了?

就在上周,我遇到了一个类似的问题。在我的例子中,是另一个来自不同方法的
@Transactional
注释导致事务被标记为仅回滚

你查过了吗


编辑:为了更清楚一点,您没有从
saveData()
方法内部发布代码。对我来说,导致此错误的原因是从我的方法内部调用另一个具有
@Transactional
(缺少
noRollback
属性)的方法,在您的例子中是
saveData()

我认为你做不到。默认情况下,您的事务正在传播到内部方法,如果此方法回滚您的事务,则外部方法只能通过未预料的回滚异常通知回滚已发生。。并承认这一点

您可以更改传播配置以启动新的内部事务,但这不会有帮助,因为它在到达外部事务之前仍将独立提交


如果不能在DAO级别设置NoRollback属性,我想最好的解决方案是从DAO中删除事务属性,并让一层facade服务调用这些DAO并定义它们自己的回滚策略。

我更新了我的问题。我在@Transactional类中调用了一个方法,但我希望这个属性是继承的,我错了吗?如何在不更改Dao类的情况下防止回滚(因为许多其他插入都需要回滚)?谢谢我不是spring+hibernate的专家,基本上我是在两三周前才开始使用它的,所以我不能给你一个明确的答案。但从我自己遇到这个问题时读到的内容来看,该属性没有被继承,这就是导致这个错误的原因,因为spring只将所有周围的事务视为回滚,除非另有指定。我很确定我通过将属性添加到我的另一个方法中修复了它,但正如您所说的,您不能仅从DAO中的回滚中排除Exception.class,可能只是为该特定异常创建一个新类并忽略它。或者您可以构建一个saveData()方法(插入的克隆)在DAO中,仅用于保存数据,然后使用@Transactional(norollboor=Exception.class)对其进行注释。然后只需调用dao.saveData(entity);而不是调用insert()
2014-02-25 20:47:44 [WARN]SqlExceptionHelper:143    SQL Error: 1205, SQLState: 41000
2014-02-25 20:47:44 [ERROR]SqlExceptionHelper:144   Lock wait timeout exceeded; try restarting transaction
2014-02-25 20:47:44 [ERROR]BigliettiService:?   Transazione in errore
org.hibernate.exception.GenericJDBCException: Lock wait timeout exceeded; try restarting transaction
...
2014-02-25 20:47:44 [ERROR]JsonHandlerExceptionResolver:?   Transaction rolled back because it has been marked as rollback-only