什么是LCN模式
LCN
模式是TX-LCN
分布式事务模式的一种,L-lock
-锁定事务单元、C-confirm
-确认事务模块状态、 notify
-通知事务单元
原理
LCN
模式是通过Spring AOP
的方式代理Connection
的方式实现对本地事务的操作,然后在由TxManager统一协调控制事务。 当本地事务提交回滚或者关闭连接时将会执行假操作,该代理的连接将由LCN连接池管理。
模式特点
-
该模式对代码的嵌入性为低。 -
该模式仅限于本地存在连接对象且可通过连接对象控制事务的模块。 -
该模式下的事务提交与回滚是由本地事务方控制,对于数据一致性上有较高的保障。 -
该模式缺陷在于代理的连接需要随事务发起方一共释放连接,增加了连接占用的时间。
源码解读
首先我们来看几个关键的类DataSourceAspect
-数据源切面类、TransactionAspect
事务切面类、LcnConnectionProxy
lcn 连接代理类、DTXLogicWeaver
分布式事务调度器、DTXServiceExecutor
分布式事务执行器
DataSourceAspect的作用
-
源码
@Aspect
@Component
public class DataSourceAspect implements Ordered {
private static final Logger log = LoggerFactory.getLogger(DataSourceAspect.class);
private final TxClientConfig txClientConfig;
private final DTXResourceWeaver dtxResourceWeaver;
public DataSourceAspect(TxClientConfig txClientConfig, DTXResourceWeaver dtxResourceWeaver) {
this.txClientConfig = txClientConfig;
this.dtxResourceWeaver = dtxResourceWeaver;
}
@Around("execution(* javax.sql.DataSource.getConnection(..))")
public Object around(ProceedingJoinPoint point) throws Throwable {
return this.dtxResourceWeaver.getConnection(() -> {
return (Connection)point.proceed();
});
}
public int getOrder() {
return this.txClientConfig.getResourceOrder();
}
}
由该类的源码,我们能够知道,
lcn
模式主要对数据库的连接进行了拦截代理。获取到数据库的连接交由lcn
来进行代理。
TransactionAspect 作用
-
源码
@Aspect
@Component
public class TransactionAspect implements Ordered {
private static final Logger log = LoggerFactory.getLogger(TransactionAspect.class