jdbc属于java事务_java-如何在JDBC中启动事务?

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值