我有一个注释为的单一服务方法 Propagation.Required. 。它执行三个独立的操作。

  1. 如果表1中没有记录,则从表z插入表1
  2. 根据用户编辑/添加插入/更新表 1
  3. 从表1中删除x条记录

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

有帮助吗?

解决方案

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

如果您将其设置为 true, ,Hibernate 会将底层 JDBC 连接置于自动提交模式,这会将您执行的每个语句包装在其自己的数据库事务中。

因此,例如,如果您的第三个查询/语句失败,则只有您的第三个查询/语句会回滚。

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

其他提示

您可以尝试在服务层之上再添加一层并从那里开始事务吗?

你肯定不希望自动提交。这可能会在每次操作后提交。关闭自动提交,并在末尾添加显式提交。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top