【问题标题】:Exception not thrown, when error occurs on second sql insert/update statement当第二个 sql 插入/更新语句发生错误时,未抛出异常
【发布时间】:2018-06-11 06:59:19
【问题描述】:

我们的问题是,我们的应用在某些情况下不会抛出 SQL 异常。 当第二个或以后的插入/更新语句发生错误时,就会发生这种情况。这种行为被描述为here

我们只得到一个日志条目,例如:ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Transaction was deadlocked on resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

此问题是否已在较新版本的 hibernate 中得到解决?或者有任何想法,我们如何修补这个?

我们正在使用:

  • Grails 2.5.6
  • 休眠 4.3.8
  • 休眠 JPA:2.1

示例:myObject.save() 创建 2 个插入语句。一个进入基表,一个进入外部表。第二次插入会导致错误,这应该会导致异常。

代码示例:

class Children {
    Parent parent
    String name
}
class Parent {
    static hasMany = [children: Children]
}

@Transactional
void save() {
    Parent parent = new Parent()
    parent.addToChildren(new Children(name: 'Bob'))
    parent.save() //more then 1 insert is executed
}

【问题讨论】:

  • 您是否尝试在单独的事务中运行每个查询?
  • ORM 自己创建插入/更新。有一个插入基表和一个插入外部表。这需要在一个事务中。
  • 编辑问题并显示代码

标签: hibernate jpa grails jdbc grails-orm


【解决方案1】:

'Children' 必须具有 'belongsTo' 闭包,才能调用 'Parent' 的 save() 以将保存也级联到 'Children'。

static belongsTo = [parent: Parent]

参考:http://gorm.grails.org/6.0.x/hibernate/manual/#gormAssociation

【讨论】:

  • 级联不是问题。如果进一步(级联)插入语句发生死锁,则不会引发异常。这是我们的问题。
猜你喜欢
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2012-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多