java - 许多数据库操作的Spring Integration @Transactional回滚

标签 java spring hibernate rollback transactional

我的问题很简单,我想回滚所有由调用我的服务方法引起的数据库更改。我在正确注释方面遇到了问题。我不太确定在哪里放置 @Transactional 以及我应该在哪里将 Propagation 设置为 REQUIRES_NEWMANDATORY。我将粘贴我编写的代码,除了抛出 SQLException 之外不会回滚数据库更改

代码:

@Service
public class SwapInsertService {

    @Autowired
    MyDao myDao;

    @Transactional(propagation = Propagation.REQURIES_NEW, rollbackFor = SQLException.class)
    public void insertToManyTables(MyData data) throws SQLException {

        insertToSpecificTables(data);
        myDao.insertTwo(data);
    }

    @Transactional(propagation = Propagation.MANDATORY)
    public void insertToSpecificTables(MyData data) throws SQLException {

        myDao.insertOne(data);
    }
}

@Repository
public class MyDaoImpl implements MyDao {

    @Transactional(propagation = Propagation.MANDATORY)
    public void insertOne(MyData data) throws SQLException {

        // INSERT
    }

    @Transactional(propagation = Propagation.MANDATORY)
    public void insertTwo(MyData data) throws SQLException {

        // throws SQLException 
    }
}

让我们假设 insertTwo 抛出 SQLException 。我想回滚所有以前的插入。 我做错了什么?

我的理解:

Propagation.REQURIES_NEW 创建新事务。 Propagation.MANDATORY 支持当前事务。

insertTwo 抛出错误,insertToManyTables 回滚一切,瞧。不幸的是,这并不容易。

编辑:重要的是要提到我正在使用 CGLIB 作为代理。

最佳答案

检查spring specific xml中数据源配置中AUTO_COMMIT是否设置为false

关于java - 许多数据库操作的Spring Integration @Transactional回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12516654/

相关文章:

java - gradle bootRun : application fail to start with classpath

java - Spring 通过 XML Beans 定义注册多个 Hibernate 数据源

Java:spring:为什么Abstract BeanFactory不允许更改父BeanFactory?

java - 未指定 hibernate.search.lucene_version : using LUCENE_CURRENT

java - Hibernate 注释 - 1 比 1,无 auto_increment

java - 我如何使用 Xpath

java - 如何使用自然的 entrySet() 顺序迭代 HashMap?

java - 如果用户想再玩一次,如何从arraylist中随机选择并再次循环?

java - 配置hibernate 5.2.10时出错

java - 防止加速器在输入子项时触发