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

Java 对JDBC commit()的每次调用是否都会隐式标记事务块的开始?,java,jdbc,transactions,Java,Jdbc,Transactions,正如本文和网站中所述,每个commit()调用是否会在给定setAutoCommit(false)的情况下隐式启动另一个事务块?视情况而定。JDBC规范允许驱动程序精确地决定何时启动一个新事务,因此不能对此进行概括。驱动程序可能会在commit()/rollback或setAutoCommit(false)之后直接启动一个新事务,尽管如果很多驱动程序真的这样做,我会感到惊讶 具体地说,JDBC 4.2(第10.1节)说(重点): 何时启动新事务是由JDBC驱动程序或底层数据源隐式做出的决定。尽管

正如本文和网站中所述,每个
commit()
调用是否会在给定
setAutoCommit(false)
的情况下隐式启动另一个事务块?

视情况而定。JDBC规范允许驱动程序精确地决定何时启动一个新事务,因此不能对此进行概括。驱动程序可能会在
commit()
/
rollback
setAutoCommit(false)
之后直接启动一个新事务,尽管如果很多驱动程序真的这样做,我会感到惊讶

具体地说,JDBC 4.2(第10.1节)说(重点):

何时启动新事务是由JDBC驱动程序或底层数据源隐式做出的决定。尽管一些数据源实现了一个显式的“BEGINTRANSACTION”语句,但没有JDBCAPI来实现通常,当当前SQL语句需要一个新事务,并且没有事务已就绪时,会启动一个新事务。


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

是的,这是真的。现在你可以用三个链接而不是两个来再次问同样的问题:)。这有点取决于所使用的JDBC驱动程序和DBMS,但一般来说,这是正确的,是的。@a_horse_和_no_名称看到我的答案,我不会假设下一个事务立即启动。