是否每次调用JDBC commit()都会隐式标记事务块的开头?

时间:2016-06-20 05:37:37

标签: java jdbc transactions

正如此Stackoverflow answerthis网站所述,每个commit()调用是否都会隐式启动给定setAutoCommit(false)的另一个事务处理块?

1 个答案:

答案 0 :(得分:3)

这取决于。 JDBC规范允许驱动程序确定何时开始新事务,因此您无法对此进行概括。驱动程序可能会在commit() / rollbacksetAutoCommit(false)之后直接启动新事务,但如果很多驱动程序确实这样做,我会感到惊讶。

特别是JDBC 4.2(第10.1节)说(强调我的):

  

何时启动新事务是由JDBC驱动程序或基础数据源隐式做出的决策。尽管某些数据源实现了显式的“begin transaction”语句,但是没有JDBC API可以这样做。 通常,当前SQL语句需要一个并且没有任何事务处理时,就会启动一个新事务。

只有在真正需要时才启动事务会更有效,并且过早启动事务会妨碍数据的可见性(取决于隔离级别)。我假设(但尚未验证)这是大多数司机所做的事情。