【问题标题】:How to resolve Snapshot isolation transaction aborted error in Hibernate如何解决 Hibernate 中的快照隔离事务中止错误
【发布时间】:2018-02-25 22:05:29
【问题描述】:

我们正在使用休眠来更新表的值然后我得到以下错误

org.hibernate.engine.jdbc.spi.SqlExceptionHelper | Snapshot isolation transaction aborted due to update conflict. You cannot use snapshot isolation to access table 'dev.TASKS' directly or indirectly in database 'DEV' to update, delete, or insert the row that has been modified or deleted by another transaction. Retry the transaction or change the isolation level for the update/delete statement.

我们使用 hibernate 4.3.11 和 SQLServer 2014 作为我们的数据库。

如何解决这个错误?

【问题讨论】:

    标签: java sql-server hibernate jpa transactions


    【解决方案1】:

    为了防止异常,数据库有两种选择:

    1. 它可以通过使用锁定来防止它们。
    2. 它可以允许冲突,但需要在事务提交时检测它们。

    传统上,2PL (Two-Phase Locking) 是提供 Strict Serializability 的事实标准。但是,尽管这可以防止所有类型的现象,但它不能扩展。

    由于扩展问题,数据库选择了较少锁定的并发控制机制,例如MVCC。但是在 MVCC 中,允许一个并发事务修改你之前读过的记录。而且,当您尝试提交时,您将获得事务中止。

    因此,您可以通过两种方式修复它:

    1. 如果并发较少,您可以使用像 JPA PESSIMISTIC_READ and PESSIMISTIC_WRITE 这样的悲观锁定。一旦您获得了需要更改的实体上的锁,其他事务就无法修改它,因此它们必须等待您释放锁。
    2. 您可以按照异常的建议重试。

    但是,重试比较棘手。如果您遇到约束违规,或者您的事务仅在某些行未修改时才应继续,则您无法重试。

    但是,重新启动工作流程并没有听起来那么糟糕。这是prevent a lost update over multiple physical database transactions的唯一途径。

    因此,虽然 Hibernate 提供一个设置来神奇地解决此问题会很棒,但这样做是错误的。事务中止的原因是to avoid breaking ACID guarantees

    因此,您应该查看发生冲突的原因,并决定锁定或重试工作流程是否更适合您的特定应用程序用例。

    【讨论】:

      猜你喜欢
      • 2011-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-24
      相关资源
      最近更新 更多