如何在JDBC中启动事务?

Connection.setTransactionIsolation(int)警告:

注意:如果在事务中调用此方法,则结果是实现定义的。

这提出了一个问题: 你如何在JDBC中开始一个事务? 清楚如何结束交易,而不是如何开始交易。

如果Connection在事务内部开始,我们应该如何在事务之外调用Connection.setTransactionIsolation(int)以避免特定于实现的行为?

回答我自己的问题:

  • JDBC连接从启用自动提交模式开始,每个SQL语句都隐式地与事务分开。
  • 希望每个事务执行多个语句的用户必须closures自动提交 。
  • 更改自动提交模式将触发当前事务的提交(如果其中一个处于活动状态)。
  • 如果启用自动提交,则可随时调用Connection.setTransactionIsolation() 。
  • 如果禁用自动提交,则只能在事务之前或之后调用Connection.setTransactionIsolation() 。 在事务中调用它会导致未定义的行为。

资料来源:

  • 的Javadoc
  • JDBC教程

我build议你阅读这个你会看到

因此,setAutoCommit(false)的第一次调用和commit()的每个调用隐含地标记事务的开始。 事务可以在被调用之前被撤消

编辑:

检查JDBC事务的官方文档

连接创build时,处于自动提交模式。 这意味着每个单独的SQL语句都被视为一个事务,并在执行后自动提交。 (更确切地说,默认情况下,SQL语句是在完成时提交的,而不是在执行时提交的。当所有的结果集和更新计数已经被检索完成后,语句就完成了。然而,在几乎所有情况下,声明已经完成,因此在声明执行之后立即执行。)

将两个或多个语句分组为事务的方法是禁用自动提交模式。 这是在以下代码中演示的,其中con是活动连接:

con.setAutoCommit(假);

来源: JDBC事务

JDBC隐含地划定了您在与事务的连接上执行的每个查询/更新。 您可以通过调用setAutoCommit(false)来closures自动提交模式并调用commit()/ rollback()来指定事务结束来自定义此行为。 Pesudo代码

 try { con.setAutoCommit(false); //1 or more queries or updates con.commit(); } catch(Exception e) { con.rollback(); } finally { con.close(); } 

现在,你已经显示了一种方法。 它应该是setTransactionIsolation(int级别) ,而不是交易分界的API。 它pipe理一个操作所做的更改何时/何时对其他并发操作( ACID中“I”http://en.wikipedia.org/wiki/Isolation_(database_systems))可见)。;

实际上, 这个来自JDBC教程的页面会更好的阅读。
你会得到你的连接,设置你的隔离级别,然后做你的更新和东西,然后提交或回滚。

也许这会回答你的问题:每个连接只能有一个事务。 如果自动提交(默认),每个select,更新,删除将自动启动并提交(或回滚)一个事务。 如果你设置自动提交,你启动一个“新”事务(意味着提交或回滚不会自动发生)。 在一些语句之后,您可以调用commit或rollback来完成当前事务并自动启动一个新事务。 您不能在纯JDBC上的一个JDBC连接上主动打开两个事务。

您可以使用这些方法进行交易:

  1. 你必须像con一样创build连接对象
  2. con.setAutoCommit(false);
  3. 您的查询
  4. 如果全部是真的con.commit();
  5. 其他con.rollback();