使用 Grails GORM 和 MySQL 的乐观锁定异常

Optimistic Locking Exception using Grails GORM and MySQL

我正在使用 Grails 2.4.4 和 MySQL 数据库。我们正在尝试在我们的数据库中克隆一组具有父子关系的 table。例如,我们有一个 table 作者及其子 table 书和具有指向作者的外键 fk_book 的书。

我们通过 Author.get(id)、克隆作者及其相关书籍检索层次结构,并使用 clonedAuthor.save(flush:true) 进行保存。我们有几个像这样的 table 的层次结构,一些具有 OneToOne 关系,一些具有 OneToMany 关系。在数据库中,外键约束被指定为 ON DELETE NO ACTION。

问题出在调用时。它正在抛出乐观锁定失败异常

Row was updated or deleted by another transaction.

我没有得到哪个事务正在更新行,因为我们只有一个事务(只有一个命中)。

我在使用 mysql 控制台 修改数据库数据时遇到了同样的问题,而一些数据已经提取到休眠会话


为什么会这样?

很简单,db和hibernate session中的数据不同步

此外,如果您将域对象(或任何相关域对象)放入会话中,请在调用 savedelete 之前尝试重新附加对象 (obj.attach())。 .

您有 3 种解决方案:merge() 或 attach() before save()... 或映射版本为 false 的实体。