【问题标题】:Hibernate does not rollback trigger-related changesHibernate 不会回滚与触发器相关的更改
【发布时间】:2016-04-17 03:55:10
【问题描述】:

我有一个带有 MySQL 数据库的应用程序。该数据库有一个表 A 和一个在该表中插入新行时的触发器。

现在,当我创建新实体(与此表关联)并在事务中使用session.save(aEntity); 保存它时,但是当我执行保存时,MySQL 激活表 A 的触发器并在其他一些中创建一个新条目表,但表 A 中的行在我调用 transaction.commit() 之前不会保存。

我有时需要回滚transaction.rollback(),但触发器会在其他表中创建新条目并且不会被删除。

我该怎么做?

【问题讨论】:

  • 你用的是什么MySQL表存储引擎?请将以下 mysql 命令的输出添加到您的问题中:show create table <TableName>
  • 存储引擎是InnoDB

标签: mysql spring hibernate triggers transactions


【解决方案1】:

当您调用save 时,Hibernate 将实体附加到持久性上下文,并且在刷新期间将添加数据库行。对于 MySQL,如果您使用 IDENTITY 实体标识符生成器,​​插入将立即发生。

触发器可能会在其他表中添加一条记录,但这也是当前数据库事务的一部分(假设您使用 InnoDB),因此当您回滚事务时,TableA 和其他表都不会保留待处理的更改。

所以你应该没事。

更新

我会尽力解释。我有一个表 A 和一个表 B。在 MySQL 中,我有一个 触发器,当在 A 中创建一行时,触发器在 B 中创建一行 具有与 A 中的行相同的标识符(但没有外键)。在里面 Hibernate Session,我创建了一个事务并创建了一个 A 的实体并保存它。这 触发器被激活并立即在 B 中创建一个条目,但是 在 A 中仍然没有条目,因为我还没有提交事务。在我做了一个之后 回滚,表 A 被还原,但 B 中的行由触发器创建 仍然存在,引用 A 中不存在的条目。 B 没有 有外键并使用 MyISAM。

这不是典型的数据库设置,也不是真正的 Hibernate 问题。你也会用普通的 JDBC 遇到这个问题。问题是表 A 使用事务感知 InnoDB 存储引擎,而表 B 工作在自动提交模式,因为被配置为使用 MyISAM。

【讨论】:

  • 是的,我使用 InnoDB,但是只有当我使用transaction.commit 时,有没有其他方法可以激活触发器?
  • 你为什么想要那个?
  • 因为有时我需要回滚,而触发器会生成一个我不需要的新行,因为它会产生不一致。触发器生成的新行,参考表A,但是我回滚的时候,这个条目不存在。
  • 但是回滚也应该恢复触发器所做的更改。
  • 这不是典型的数据库设置,也不是真正的 Hibernate 问题。你也会用普通的 JDBC 遇到这个问题。问题是表 A 使用事务感知 InnoDB 存储引擎,而表 B 工作在自动提交模式,因为被配置为使用 MyISAM。
猜你喜欢
  • 2017-05-26
  • 2011-01-03
  • 2016-11-27
  • 2019-04-21
  • 2018-08-22
  • 2017-11-08
  • 1970-01-01
  • 1970-01-01
  • 2020-01-23
相关资源
最近更新 更多