【问题标题】:Autocommit and Spring Declarative Transactions自动提交和 Spring 声明式事务
【发布时间】:2010-11-22 11:03:04
【问题描述】:

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

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

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

【问题讨论】:

  • 如果没有看到您的代码和配置,我们就无法回答您。

标签: hibernate spring hibernate-mapping


【解决方案1】:

您能否尝试在服务层之上再添加一层并从那里开始事务。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      您绝对不想启用自动提交。这可能会在每次操作后提交。关闭自动提交,并在最后添加显式提交。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-21
        • 2017-01-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多