java - spring什么是事务 - transactiontemplate事务




如何在JDBC中启动事务? (5)

JDBC隐式地划分您在与事务的连接上执行的每个查询/更新。 您可以通过调用setAutoCommit(false)来关闭自动提交模式并调用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 level)并且不是事务划分的api。 它管理一个操作所做的更改如何/何时对其他并发操作可见, ACID中“I” (http://en.wikipedia.org/wiki/Isolation_(database_systems))

Connection.setTransactionIsolation(int)警告:

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

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

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


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


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


您可以将这些方法用于事务:

  1. 你必须像con一样创建连接对象
  2. con.setAutoCommit(false);
  3. 你的疑问
  4. 如果一切都是真的con.commit();
  5. else con.rollback();

首先,如果您希望以“setAutoCommit(true)”模式保持连接但仍想要事务,则可以手动运行事务:

 try (Statement statement = conn.createStatement()) {
      statement.execute("BEGIN");
      try {
        // use statement ...
        statement.execute("COMMIT");
      }
      catch (SQLException failure) {
        statement.execute("ROLLBACK");
      }
  }






transactions