多数据源事务控制
最后更新:2024-05-23 14:51:32
|
状态:未完成
这里说的是有多个数据源,并且多个数据源需要控制事务。【为会么要创建多个事务管理器】
如果然后有多个数据源,但只需要控制主数据源的事务,不要往下看只需要参考【多数据源注解事务异常】
//推荐这种方式,可以避免线程共享的引起的切换失败问题
如果然后有多个数据源,但只需要控制主数据源的事务,不要往下看只需要参考【多数据源注解事务异常】
分两种情况说明
一、需要控制事务的方法内部不需要切换数据源。并且编码阶段已经可以确认是哪个数据源
这种情况比较简单,只需要在注解上明确指定用哪个事务管理器即可@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提交回滚
【示例源码】
注意如果注册了多数据源,并使用注解事务有可能会报异常,参考【多数据源注解事务异常】