如何在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连接上主动打开两个事务。
您可以使用这些方法进行交易:
- 你必须像
con
一样创build连接对象 -
con.setAutoCommit(false);
- 您的查询
- 如果全部是真的
con.commit();
- 其他
con.rollback();