spring中的事務

出現問題的背景:

γ項目中在風險部分會有系統消息和郵件通知用戶,這裏涉及到事務,具體的流程爲update數據之後,又要利用多線程根據assetsId獲取當前資產的風險等級,並將相應的消息和郵件發送給用戶。

產生原因:

外層大方法使用事務,在方法中又新起多線程進行消息和郵件等操作,這裏多線程不在包括在事務之中,所以讀取到的數據是update操作之前的數據。事務中開啓多線程,新的線程的事務不受外面大事務的影響,新開的事務。

外層的方法所有的代碼執行後(所有線程結束前),數據庫的操作均會在一個事務中提交。但是多線程自己的操作會提交自己的事務,想要讀取update之後的數據,由於外層的事務還未提交,所以讀取了之前的舊數據,也從側面說明了事務的正確性,事務未結束,數據未更新。

 

解決方案:

1.在多線程中進行休眠等待,等待幾秒鐘再進行數據的讀取,這樣大概率很讀取update之後的數據,但是這並不是一定ok的,可能在sleep之後並沒有完成update操作,此時讀到的還是舊數據。

2.將多線程的操作放置到大事務之後再進行操作。多線程操作有需要大事務中的參數可以在大事務執行完成後返回,然後進行使用。

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