Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.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/2/spring/12.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
Java Spring集成@许多数据库操作的事务回滚_Java_Spring_Hibernate_Rollback_Transactional - Fatal编程技术网

Java Spring集成@许多数据库操作的事务回滚

Java Spring集成@许多数据库操作的事务回滚,java,spring,hibernate,rollback,transactional,Java,Spring,Hibernate,Rollback,Transactional,我的问题很简单,我想回滚由调用我的服务方法引起的所有db更改。我在正确注释方面有问题。我真的不确定将@Transactional放在哪里,以及应将传播设置为REQUIRES\u NEW或MANDATORY。我将粘贴我编写的代码,除了抛出SQLException不会回滚数据库更改之外 守则: @Service public class SwapInsertService { @Autowired MyDao myDao; @Transactional(propagati

我的问题很简单,我想回滚由调用我的服务方法引起的所有db更改。我在正确注释方面有问题。我真的不确定将
@Transactional
放在哪里,以及应将传播设置为
REQUIRES\u NEW
MANDATORY
。我将粘贴我编写的代码,除了抛出
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\u NEW
创建新事务。
传播。必填项
支持当前事务

insertTwo
抛出错误,
insertToManyTables
回滚所有内容并查看。不幸的是,这并不是那么容易


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

检查特定于spring的xml中的数据源配置中是否将AUTO_COMMIT设置为false

检查特定于spring的xml中的数据源配置中是否将AUTO_COMMIT设置为false

是否声明了TransactionManager(
是的,已经声明了,我在日志中看到创建了代理。据我所知,代理创建是由@Transactional启动的。我正在使用CGLIB。您声明TransactionManager了吗(<代码>是的,它在日志中被声明,我在日志中看到有代理创建。据我所知,代理创建是通过事务处理来触发的。我使用CGLIB。我会看一看并让你知道。我没有考虑这个。TX。看起来你是对的,我的数据源被设置为自动提交。TX。我会看一看并让你知道。我没有考虑这个。x、 看起来你是对的,我的数据源设置为auto-commit.Thx。