2012-02-14 69 views
1

我有一个MySQL表实现邮件队列,我也用它来发送报告系统中意外错误的邮件。有时,这些意外的错误会在事务中产生,所以当我回滚交易时,我也撤销邮件队列表中插入的行(报告意外错误的邮件)。Mysql插入行忽略当前事务

我的问题是我该如何强制在中间的表中插入一行,忽略可能的事务回滚?我的意思是,如果事务最终回滚,而不是回滚报告错误细节的电子邮件的行插入。

该表可以被多个异步进程读取以发送队列中的邮件,因此在这种情况下,行必须被阻止发送一次邮件,因此不可能使用MyISAM表类型并且正在使用Innodb的。

在此先感谢。

+0

为什么不实施适当的异步邮件队列而不尝试(错误)使用RDBMS功能? – 2012-02-14 12:07:39

+0

@ N.B。我不同意:RDBMS是一个非常有效的邮件队列。所有基于RDBMS的MTA都与我一致。 – 2012-02-14 12:09:57

+0

@EugenRieck我在哪里说它是无效的?它在这里并不适合这种情况,事务正在使用,但查询需要“生存”回滚。这意味着设计失败,不同的方法可能是比试图强制某些数据在回滚中生存更好的解决方案。 – 2012-02-14 12:16:08

回答

2

如果您INSERT应该在交易中存活ROLLBACK,可以肯定地说,它不属于交易的一部分。所以你应该做的是简单地将它移到交易之外。有很多方法来实现这一目标:

  • 的交易,而不是运行你INSERT虽然,存储在会话变量 领域(这些都将生存ROLLBACK), 后的交易从会话中运行插件变量
  • 重新考虑你的架构 - 这弥漫着一些深层次躺在-问题
  • 打开第二DB连接并运行在这一个你INSERT,它不会被第一个连接上的事务的影响。
+0

谢谢,打开一个新的连接工作正常。 – user1023768 2012-02-14 16:51:29

0

您可以创建与数据库不同的连接来插入错误,并且它不会位于同一个事务上下文中,因此它们将被插入。