多数据源事务控制

最后更新:2024-04-07 20:59:27 | 状态:未完成
这里说的是有多个数据源,并且多个数据源需要控制事务。【为会么要创建多个事务管理器
如果然后有多个数据源,但只需要控制主数据源的事务,不要往下看只需要参考【多数据源注解事务异常

分两种情况说明

一、需要控制事务的方法内部不需要切换数据源。并且编码阶段已经可以确认是哪个数据源
     这种情况比较简单,只需要在注解上明确指定用哪个事务管理器即可@Transactional(value = "transactionManager")
     关于bean.name参考【多数据源事务管理器bean.name

二、需要控制事务的方法内部需要切换数据源。

    在方法内部切换数据源,就不要用注解了,因为注解要先执行,这时还不知道要切换到哪个数据源。
//推荐这种方式,可以避免线程共享的引起的切换失败问题
public void inserts(String ds, DataRow row){
	AnylineService service = ServiceProxy.service(ds); //返回操作固定数据源的service
	TransactionState status = TransactionProxy.start(ds);//开启事务  
    或service.start(); //因为service上绑定了数据源 所以启动事务时不需要数据源参数
	try {
		service.insert("SSO_USER", row);
		TransactionProxy.commit(status); //提交事务 这里不需要指定数据源,因为status已经绑定了数据源
        或service.commit(statrus);
	}catch (Exception e){
		TransactionProxy.rollback(status);//回滚事务
        或service.rollback(status)
	}
}

执行过程说明:
事务管理器绑定一个固定的数据源,这个绑定关系永远都不会改变。
开启事务时,先根据当前数据源(假设此时是数据源A)找到对应的事务管理器A,再根据返回的事务管理器创建TransactionState,
TransactionState与数据源A、事务管理器A绑定,在此之后无论怎么样切换数据源(假设切换到B)都不影响绑定关系。
这时在提交或回滚事务时,会根据TransactionState换到对应的事务管理器A(与当前数据源无关),再通过事务管理器A提交回滚

示例源码

注意如果注册了多数据源,并使用注解事务有可能会报异常,参考【多数据源注解事务异常

最近更新 搜索 提交