1 DruidXADataSource
DruidXADataSource,顾名思义是基于 XA 协议的Datasource,XA简单来说就是两阶段提交的分布式事务。
有兴趣的可以看下 分布式事务方案(XA 2PC TCC Seata)(图画得特别好)
看了下历史版本,最早的1.0.17就已经支持了, 再翻了下提交记录,2011年就支持了,也真的是不得不佩服想得很全面。
看下类图:

额外实现了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获取标准的XAConnection,内部通过数据库类型的Util,根据Driver的类型、版本等,反射创建相应的instance
最后通过获取的XAConnection和DruidPooledConnection初始化DruidPooledXAConnection返回
3 分布式事务的具体实现
连接池中还是只提供标准的XAConnection接口,具体的实现还是要依赖Atomikos等框架的集成。
其中XAConnection 中有一个XAResource,其中有个Xid,应该就是用来定义事务ID的,然后定义了一系列根据xid 的commit,rollback,start,end等方法;
XAResource还定义了很多常量,看起来是随机数的,应该是定义了事务的状态,后续可以深入了解一下,
网友评论