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