Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.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/5/date/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
Java 在spring事务期间autocommit=true_Java_Spring_Jdbc - Fatal编程技术网

Java 在spring事务期间autocommit=true

Java 在spring事务期间autocommit=true,java,spring,jdbc,Java,Spring,Jdbc,试图理解交易。。。我在一个方法中使用Spring的JdbcTemplate和@Transactional注释。尽管事务在方法执行期间处于活动状态(如日志和TransactionSynchronizationManager.isActualTransactionActive())所示,自动提交似乎也已打开(如jdbcTemplate.getDataSource().getConnection().getAutoCommit()所示)) 我不明白两件事 jdbc事务不是在代码块末尾关闭自动提交和手

试图理解交易。。。我在一个方法中使用Spring的
JdbcTemplate
@Transactional
注释。尽管事务在方法执行期间处于活动状态(如日志和
TransactionSynchronizationManager.isActualTransactionActive())
所示,自动提交似乎也已打开(如
jdbcTemplate.getDataSource().getConnection().getAutoCommit()所示)

我不明白两件事

  • jdbc事务不是在代码块末尾关闭自动提交和手动提交吗?spring事务管理器不是应该在幕后做类似的事情吗
  • 如果autocommit真的启用了:如果对数据库的一次修改成功,而随后的一次修改失败,那么spring如何回滚以前的更改(尽管autocommit值为0,但它确实会这样做)
如果处理了
DataSourceTransactionManager
doBegin()
方法,则会处理该标志

如果你看一下来源,有:

if(con.getAutoCommit()){
...
con.setAutoCommit(假);

}

您使用的是哪种TransactionManager?您正在使用哪个数据源?请注意,jdbcTemplate.getDataSource().getConnection()不会返回当前连接,但会返回一个新连接,而不是由TransactionManager处理。对传递给JdbcTemplate回调的连接调用getAutoCommit()时会发生什么情况?SimpleDriverDataSource和DataSourceTransactionManager。请阅读我的更新评论。感谢您的评论。我不知道该怎么做(刚刚开始阅读),只是想检查一下我对自动提交应该在事务期间关闭的理解是否正确是的,它应该关闭,而且很可能是。通常将行映射器或其他类型的回调传递给JdbcTemplate方法。从这些回调内部获取实际使用的连接(例如,通过调用resultSet.getStatement().getConnection()),并检查该连接上的autocommit标志。