2010-11-22 92 views
0

我有一个使用Propagation.Required注释的服务方法。它执行三个单独的操作。Autocommit和Spring声明性事务

  1. 插入到表1从表Ž如果没有记录在表每个用户1
  2. 插入/更新表1作为编辑/附加
  3. 从表中删除X记录1

原谅我的无知,但不应该在一次交易中运行所有这些?从某种意义上讲,如果第三个查询运行到一个异常,不应该第一次回滚呢?这在我的情况下不会发生。休眠自动提交设置是否会以任何方式影响txn边界?在我的情况下,自动提交设置为true。我所要求的是,只有在所有这些表都成功的情况下,这些表才会进行提交。

+1

我们没有机会在没有看到您的代码和配置的情况下回答您。 – skaffman 2010-11-22 11:49:17

回答

0

是的,休眠connection.autocommit属性设置将影响事务边界。

如果将此参数设置为true,Hibernate会将底层JDBC连接置于自动提交模式,这将自动覆盖您在自己的数据库事务中执行的每条语句。因此,例如,如果第三个查询/语句失败,则只有第三个查询/语句会回滚。

要将三者作为一个单元执行,您需要关闭自动提交并在单个事务的上下文中执行全部三个,声明式或其他方式。

1

你可以尝试添加一层比服务层更高的层,并从那里开始事务。

0

你肯定不想自动提交。这可能会在每次操作之后进行。关闭自动提交,并在最后添加一个显式提交。