如何在 JDBC 中启动一个事务?

新手上路,请多包涵

Connection.setTransactionIsolation(int) 警告:

注意:如果在事务期间调用此方法,则结果由实现定义。

这就提出了一个问题: 如何在 JDBC 中开始一个事务? 很清楚如何结束事务,但不清楚如何开始事务。

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

原文由 Gili 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 649
2 个回答

回答我自己的问题:

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

请参阅 Oracle 的 JDBC 教程

原文由 Gili 发布,翻译遵循 CC BY-SA 4.0 许可协议

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 Yarram 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题