我有多個線程將事件寫入MySQL表events
。確保MySQL中的auto_increment值排序
該表的tracking_no
列配置爲auto_increment
,用於強制執行事件排序。 不同的讀者正在使用events
,他們定期輪詢表以獲取新事件,並保留最後使用事件的值以獲取每次投票中的所有新事件。
事實證明,目前的實施留下遺漏一些事件的機會。
這是發生了什麼:
Thread-1
開頭的「插入」交易,它需要從AUTO_INCREMENT列(1)的下一個值,但需要一段時間才能完成Thread-2
開始「插入」交易,它需要下一個auto_incremente值(2)並在Thread-1
之前完成寫入。Reader
民意調查並要求track_number大於0的所有事件;它得到事件2,因爲Thread-1
仍然落後。 事件被消耗,Reader
將其跟蹤狀態更新爲2.Thread-1
完成插入,事件1出現在表中。Reader
對於2之後的所有事件再次進行輪詢,並且插入事件1時,它將永遠不會被再次拾取。
看來,這可以通過到事務完成時改變auto_increment
策略來鎖定整個表來解決,但如果可能的話,我們會避免。
我想補充當事件被創建(即使它最後一次更新)和消費者會詢問事件經過一定時間後插入(甚至更新),反映一個時間戳列。這將使您可以使用auto_increment,而無需表鎖定。另一種解決方案是減少交易開放的時間以避免此類問題。 – Shadow
如何生成時間戳值? –