2012-02-14 115 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

您可以創建與數據庫不同的連接來插入錯誤,並且它不會位於同一個事務上下文中,因此它們將被插入。