java-如何在JDBC中启动事务?
Connection警告:
注意:如果在事务期间调用此方法,则结果是实现定义的。
这就提出了一个问题:如何在JDBC中开始事务? 很明显,如何结束事务,但不知道如何开始事务。
如果Connection在事务内部开始,我们应该如何在事务外部调用Connection.setTransactionIsolation(int),以避免特定于实现的行为?
Gili asked 2019-11-04T11:34:59Z
7个解决方案
52 votes
回答我自己的问题:
JDBC连接以启用的自动提交模式开始,在该模式下,每个SQL语句都与事务隐式地划界。
希望每个事务执行多个语句的用户必须关闭自动提交。
更改自动提交模式会触发当前事务的提交(如果一个事务处于活动状态)。
如果启用了自动提交,则可以随时调用Connection.setTransactionIsolation()。
如果禁用了自动提交,则只能在事务之前或之后调用Connection.setTransactionIsolation()。 在事务中间调用它会导致未定义的行为。
资料来源:
的Javadoc
JDBC教程
Gili answered 2019-11-04T11:36:04Z
25 votes
JDBC隐式划分您在与事务的连接上执行的每个查询/更新的范围。 您可以通过调用setAutoCommit(false)来关闭自动提交模式,并调用commit()/ rollback()来指示事务结束,从而自定义此行为。 伪代码
try
{
con.setAutoCommit(false);
//1 or more queries or updates
con.commit();
}
catch(Exception e)
{
con.rollback();
}
finally
{
con.close();
}
现在,您所显示的方法中有一个类型。 应该设置为setTransactionIsolation(int level),而不是事务划分的api。 它管理一个操作所进行的更改如何/何时对其他并发操作可见,即ACID中的“ I”([http://en.wikipedia.org/wiki/Isolation_(database_systems))]
Aravind R. Yarram answered 2019-11-04T11:36:38Z
18 votes
我建议你读这个,你会看到
因此,第一个 setAutoCommit(false)和每次调用 commit()隐式标记开始 交易。 交易可以 在他们犯下之前撤消 呼唤
编辑:
查看有关JDBC事务的官方文档
创建连接后,它处于自动提交模式。 这意味着 每个单独的SQL语句都被视为事务,并且 执行后立即自动提交。 (更多 精确的说,默认情况是在执行时提交一条SQL语句 完成,而不是在执行时。 当所有 已检索到其结果集和更新计数。 在几乎 但是,在所有情况下,声明均已完成,因此已提交, 立即执行。)
允许将两个或多个语句分组为一个 事务是禁用自动提交模式。 这证明了 在以下代码中,其中con是活动连接:
con.setAutoCommit(false);
来源:JDBC事务
Necronet answered 2019-11-04T11:37:48Z
9 votes
实际上,JDBC教程中的该页面会更好地阅读。
您将获得连接,设置隔离级别,然后进行更新和填充,然后进行提交或回滚。
Romain Hippeau answered 2019-11-04T11:38:19Z
5 votes
首先,如果希望将连接保持在“ setAutoCommit(true)”模式但仍需要事务,则可以手动运行事务:
try (Statement statement = conn.createStatement()) {
statement.execute("BEGIN");
try {
// use statement ...
statement.execute("COMMIT");
}
catch (SQLException failure) {
statement.execute("ROLLBACK");
}
}
rogerdpack answered 2019-11-04T11:38:43Z
4 votes
您可以使用以下方法进行交易:
您必须创建con.rollback();之类的连接对象
con.rollback();
您的查询
如果全部正确con.rollback();
其他con.rollback();
Manochehr answered 2019-11-04T11:39:48Z
3 votes
也许这会回答您的问题:每个连接只能有一个事务。如果启用了自动提交(默认),则每次选择,更新,删除都会自动启动和提交(或回滚)事务。如果您将自动提交设置为关闭,则会启动“新”事务(意味着不会自动发生提交或回滚)。 在执行一些语句之后,您可以调用commit或rollback,这将完成当前事务并自动启动一个新事务。您不能在纯JDBC的一个JDBC连接上主动打开两个事务。
Pittmann György answered 2019-11-04T11:40:13Z