監聽事務提交發送消息的一個bug

之前我做過一個功能,在事務提交之後發送mq消息,目的是爲了避免消息在事務提交之前消費,造成髒數據或者報錯

使用監聽器實現在事務提交後發送消息

然後我爲了方便以後查看消息發送記錄,排查問題,在消息發送之後寫了一個方法保存消息。這個時候就出現問題了,有的消息能夠被保存,有的消息保存不了,於是我苦苦找了兩個小時的原因,發現這發送消息的代碼有一個區別,一個有事務,一個沒有事務。

我嘗試了@transactional註解,transactionManager.getTransaction(new DefaultTransactionDefinition())編程事務,和沒有事務三種情況,發現只要加上了事務,在監聽消息發送事件中的語句就不會被commit。而沒有事務語句就能被成功發出。

當然,我不能去掉事務,這樣的話我使用這個監聽機制就沒有意義了,我想是因爲語句是寫在監聽事務提交代碼裏的,所以那時候事務已經被提交了,那麼我新建一個事務可不可以呢?答案是可以的。

使用@Transactional(propagation=Propagation.REQUIRES_NEW,rollbackFor=Exception.class)就可以在事務提交事件監聽中commit語句了。

哎,事務這個東西真的是我在編程生涯中遇到最多麻煩的東西了,仔細想想,不管是緩存,鎖,mq消息,分佈式服務器,都一定會碰到事務問題。重要性和併發問題一樣,可以稱爲程序員的兩大難題。

完。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章