1 DruidXADataSource
DruidXADataSource反肋,顧名思義是基于 XA 協(xié)議的Datasource,XA簡單來說就是兩階段提交的分布式事務(wù)界睁。
有興趣的可以看下 分布式事務(wù)方案(XA 2PC TCC Seata)(圖畫得特別好)
看了下歷史版本,最早的1.0.17就已經(jīng)支持了, 再翻了下提交記錄蚕断,2011年就支持了,也真的是不得不佩服想得很全面入挣。
看下類圖:
額外實(shí)現(xiàn)了JDBC的XADataSource
2 getXAConnection
同樣最主要的還是獲取連接的流程亿乳,先看下源碼:
@Override
public XAConnection getXAConnection() throws SQLException {
DruidPooledConnection conn = this.getConnection();
Connection physicalConn = conn.unwrap(Connection.class);
XAConnection rawXAConnection = createPhysicalXAConnection(physicalConn);
return new DruidPooledXAConnection(conn, rawXAConnection);
}
獲取連接,獲取出來的是封裝過的DruidDataSource
然后unwrap獲取物理連接
通過createPhysicalXAConnection獲取標(biāo)準(zhǔn)的XAConnection,內(nèi)部通過數(shù)據(jù)庫類型的Util葛假,根據(jù)Driver的類型障陶、版本等,反射創(chuàng)建相應(yīng)的instance
最后通過獲取的XAConnection和DruidPooledConnection初始化DruidPooledXAConnection返回
3 分布式事務(wù)的具體實(shí)現(xiàn)
連接池中還是只提供標(biāo)準(zhǔn)的XAConnection接口聊训,具體的實(shí)現(xiàn)還是要依賴Atomikos等框架的集成抱究。
其中XAConnection 中有一個(gè)XAResource,其中有個(gè)Xid带斑,應(yīng)該就是用來定義事務(wù)ID的鼓寺,然后定義了一系列根據(jù)xid 的commit,rollback勋磕,start妈候,end等方法;
XAResource還定義了很多常量朋凉,看起來是隨機(jī)數(shù)的州丹,應(yīng)該是定義了事務(wù)的狀態(tài),后續(xù)可以深入了解一下杂彭,