實現多資料來源事務

2021-09-24 07:06:33 字數 2377 閱讀 7667

最近在重構專案中,需要相容多資料來源,故此實現下多資料來源事務。

這次重構專案中,為了支援後續龐大的資料量接入,更迭了資料庫,但是為了要相容老版本,也不能直接拿掉老的資料庫。所以就有了相容多資料來源的需求,尤其是要保證事務。

其實這個需求就是要實現分布式事務,但是我們的這個場景是在乙個服務內,所以可以利用aop來輕量的實現這個需求,若是多個服務的話,就需要實現乙個管理器。

用過spring的都知道,我們一般都是使用@transactional註解,但是這個註解在多資料來源下,只能支援指定的資料來源(不指定就是預設的)。

所以我們新建個自定義註解:

@target(elementtype.method)

@retention(retentionpolicy.runtime)

@documented

public @inte***ce multitransactional

複製**

再定義乙個切面:

/**

* 多資料來源事務

* * @author 7le

*/@slf4j

@aspect

@order(-7)

@component

public class multitransactionalaspect

object ret = pjp.proceed();

commit(datasourcetransactionmanagerstack, transactionstatusstack);

return ret;

} catch (throwable e)

}private boolean opentransaction(stackdatasourcetransactionmanagerstack,

stacktransactionstatusstack, multitransactional multitransactional)

for (string beanname : transactionmangernames)

return

true;

}private void commit(stackdatasourcetransactionmanagerstack,

stacktransactionstatusstack)

}private void rollback(stackdatasourcetransactionmanagerstack,

stacktransactionstatusstack)

}}複製**

這樣就大功告成,只需要在需要的方法上,加上@multitransactional()

實現的**在 springcloud-gateway

在使用的時候,需要注意一些細節,要加上@enabletransactionmanagement

以及@multitransactional()aop的方式,那就意味著是動態**的,那下面的方式就會失效:

上面也提到過這個方案比較輕量,也是針對一些對資料一致性要求不高的場景,因為會存在資料不一致的可能。

我們用偽**來描述下,假設2個資料來源

begin1

begin2

sql1

sql2

commit1

commit2

複製**

這種方案是可以實現在sql1 sql2之間的異常回滾。如果出現commit1提交成功,commit2提交失敗(或者超時)這種情況,就會造成資料不一致,雖然這種情況概率很低,但也是乙個隱患。

這個實現很類似於2pc,都會有在乙個參與者執行任務提交後,另乙個參與者出現異常而導致資料不一致的問題。

其實一般情況下,系統的需求只是要達到最終一致性,那就可以考慮使用tcc,對每個事物進行try,如果執行沒有問題,再執行confirm,如果執行過程**了問題,則執行操作的逆操cancel(自動化補償手段)。

但是tcc對每個事務都需要try,再執行confirm,略微顯得臃腫,根據不同的業務場景可以有更好的方案(比如補償模式,定期校對模式之類),具體的可以看分布式服務化系統一致性的「最佳實幹」

抽了點時間,自己實現了乙個分布式事務的中介軟體,在一些對資料一致性要求高的場景可以使用。shine-mq 相應的設計思路在 分布式事務:基於可靠訊息服務

李豔鵬. 著. 分布式服務架構:原理、設計與實戰[m].

SpringBoot多資料來源配置事務

在多資料來源中配置事務,其實對於springboot來很簡單,當然這個的前提是首先把多資料來源都配好的情況下,如果不會多資料來源配置,請看該系列springboot整合多資料來源 enabletransactionmanagement public class public static void ...

Spring多資料來源 多事務

因專案業務需要同時連線兩個資料庫,同時需要事務支援,參考網上資料試過實現spring介面來自動切換資料來源,但是事務只有乙個資料來源可以使用,故採用如下方式配置,掃瞄所有map檔案,通過類上方註解區分使用哪個資料來源,通過在service方法中配置 transactional value 事務名 來...

Spring多資料來源JTA事務

connector.jar 2.新增jotm配置檔案carol.properties,放到類路徑下 兩種方法 1 從carol 3.0.7.jar中複製carol defaults.properties到專案中,將檔名改為carol.properties即可 2 自已手動編寫,配置檔案內容如下 jn...