springboot中如何使用多数据源下的事务管理

sonicx991 发布于 2017/11/01 18:53
阅读 1K+
收藏 1

现在springboot项目使用继承AbstractRoutingDataSource的方法

动态切换数据源,ORM使用mybatis

尝试使用事务注解会造成切数据库失败的情况,

请问这个时候如何使用事务处理,还有springboot能否直接使用

txmanager管理所有的service层

加载中
0
CodeZero
CodeZero

springboot使用多数据源,如果在事务中切换数据源是会有问题的,是由于springboot的事务同步机制造成的,在开启了事务后,springboot会在当前线程记录下sessionfactory对应的session,然后,由于你用的是AbstractRoutingDataSource,切换数据源时需要重新Open一个session的,而springboot在open一个session,会先判断是是否开启了事务,如果是,则在缓存里面,通过sessionfactory获取session,然后嘛,你只有一个sessionfactory,且你开启了事务,so,嵌套的service会使用相同的session,所以,切换数据库无效,若需要在事务中切换其它数据源,需要手动opensession

CodeZero
CodeZero
回复 @sonicx991 : 注入SessionFactory到Service中,需要切换的时候getSession()然后open,需要注意的是,这个时候,open的Session是不受管理的,也就是说,你需要setAutoCommit(false)然后手动事务同步,并且,这个session是不能向下同步的
s
sonicx991
具体需要怎么做的呢 现在session open是由mybatis进行管理的
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部