springboot 動態多資料來源事務
由於近期專案要對資料庫進行劃分成多個數據庫,從當一的資料庫,根據業務進行劃分多個數據庫,所以使用動態路由+aop來實現資料庫的動態切換,當是其中有一個重要的問題,就是事務要怎麼解決,比如在一個service中對其他業務資料庫進行查詢,修改,新增,會出現資料來源不會進行切換的問題,這個問題就是事務導致的,只要你在service中開啟事務,service中的對其他業務的資料庫操作只會使用開啟事務時的資料來源,因為開啟事務之後資料來源會被快取下來,service主體會從快取中拿資料來源,所以導致其他業務資料來源切換失敗。
解決辦法:
因為這個問題是事務導致,所以要從事務中下手,spring事務註解中的傳播級別可以解決這個問題,spring預設的傳播級別是required只會使用當前事務,所以在service中你要對其他service進行修改、新增時,需要在另外的一個service中開啟另一個新事務使用required_new建立一個新的事務,就會切換資料來源,當你要對另外一個service進行查詢時開啟另一個事務使用not_supported把主service中的事務掛起來,這樣就會切換資料來源了。
spring的事務傳播級別:
REQUIRED:支援當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。 SUPPORTS:支援當前事務,如果當前沒有事務,就以非事務方式執行。 MANDATORY:支援當前事務,如果當前沒有事務,就丟擲異常。 REQUIRES_NEW:新建事務,如果當前存在事務,把當前事務掛起。 NOT_SUPPORTED:以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。 NEVER:以非事務方式執行,如果當前存在事務,則丟擲異常。 NESTED:支援當前事務,如果當前事務存在,則執行一個巢狀事務,如果當前沒有事務,就新建一個事務。