Mop*_*per 5 mysql triggers hibernate
我们在几个表上有一个简单的审计系统.这一切都很好,但每隔一段时间,我们就会在导致触发器触发的操作中得到这样的错误:
java.sql.SQLException: Explicit or implicit commit is not allowed in stored function or trigger.
不幸的是,我们无法弄清楚我们的触发器如何导致提交.
这些是(有时)导致错误的触发器:
CREATE
TRIGGER `my_schema`.`fileDescriptorInsertTrigger`
AFTER INSERT ON `my_schema`.`FILE_DESCRIPTOR`
FOR EACH ROW
insert into `AUDIT_EVENT`
(`applicationId`,`classifier`,`lastModified`)
values
(NEW.application,'FILE_AND_DIR',NOW())
on duplicate key
update lastModified=NOW();
CREATE
TRIGGER `my_schema`.`fileDescriptorUpdateTrigger`
AFTER UPDATE ON `my_schema`.`FILE_DESCRIPTOR`
FOR EACH ROW
update `AUDIT_EVENT`
set lastModified=NOW()
where classifier='FILE_AND_DIR'
and applicationId=NEW.application;
CREATE
TRIGGER `my_schema`.`fileDescriptorDeleteTrigger`
AFTER DELETE ON `my_schema`.`FILE_DESCRIPTOR`
FOR EACH ROW
update `AUDIT_EVENT`
set lastModified=NOW()
where classifier='FILE_AND_DIR'
and applicationId=OLD.application;
Run Code Online (Sandbox Code Playgroud)
编辑:根据要求,输出 show variables like '%commit%'
Variable_name Value
innodb_commit_concurrency 0
innodb_flush_log_at_trx_commit 1
Run Code Online (Sandbox Code Playgroud)
编辑2
错误只会在INSERT打开之后发生my_schema.FILE_DESCRIPTOR,因此会将其缩小到INSERT TRIGGER但是即便如此我也不知道它是如何导致提交的.
我们确实有Hibernate,所以实际上Hibernate正在进行插入,我们还有一个映射在AUDIT_EVENT表上的实体,但是Hibernate(应该)永远不会写入AUDIT_EVENT表.
如果有帮助,我上传了一个完整的堆栈跟踪.
发生这种情况是因为死锁,这就是发生显式提交/回滚的原因。请尝试处理此活动。这里有一些可能对您有帮助的链接。
http://bugs.mysql.com/bug.php?id=24989
http://lists.mysql.com/commits/27471
尝试使用读提交隔离级别。
transaction-isolation = READ-COMMITTED
Run Code Online (Sandbox Code Playgroud)
这可能会解决您的问题。这是参考链接
http://www.toofishes.net/blog/mysql-deadlocking-simple-inserts/
http://dev.mysql.com/doc/refman/5.5/en/innodb-deadlocks.html
希望这会有所帮助。
| 归档时间: |
|
| 查看次数: |
977 次 |
| 最近记录: |