java多数据源回滚_spring 多数据源一致性事务方案

spring 多数据源配置

spring 多数据源配置一般有两种方案:

1、在spring项目启动的时候直接配置两个不同的数据源,不同的sessionFactory。在dao 层根据不同业务自行选择使用哪个数据源的session来操作。

2、配置多个不同的数据源,使用一个sessionFactory,在业务逻辑使用的时候自动切换到不同的数据源,有一个种是在拦截器里面根据不同的业务现切换到不同的datasource;有的会在业务层根据业务来自动切换。但这种方案在多线程并发的时候会出现一些问题,需要使用threadlocal等技术来实现多线程竞争切换数据源的问题。

【本文暂时只讨论第一种方案】

spring多事务配置主要体现在db配置这块,配置不同的数据源和不同的session

1、一下贴出 spring-db.xml配置

http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-3.0.xsd

http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd

http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">

2、dao层做了一个小的封装,将不同的SqlSessionFactory 注入到 SessionFactory,通过BaseDao来做简单的封装,封装不同库的基本增删改。dao实现层都集成于Basedao 这样的话,实现可以根据自己需要来选择不同的库来操作不同的内容。

session工厂

package com.neo.dao;

import com.neo.entity.Entity;

public class BaseDao extends SessionFactory{

public void test1Update(Entity entity) {

this.getTest1Session().update(entity.getClass().getSimpleName()+".update", entity);

}

public void test2Update(Entity entity) {

this.getTest2Session().update(entity.getClass().getSimpleName()+".update", entity);

}

}

BaseDao

package com.neo.dao;

import com.neo.entity.Entity;

public class BaseDao extends SessionFactory{

public void test1Update(Entity entity) {

this.getTest1Session().update(entity.getClass().getSimpleName()+".update", entity);

}

public void test2Update(Entity entity) {

this.getTest2Session().update(entity.getClass().getSimpleName()+".update", entity);

}

}

以上的配置在多数据源连接,正常的增删改都是没有问题的,但是遇到分布式的事务是就出问题:

测试代码:

package com.neo.service.impl;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import org.springframework.transaction.annotation.Transactional;

import com.neo.dao.UserDao;

import com.neo.dao.UserInformationsDao;

import com.neo.entity.UserEntity;

import com.neo.entity.UserInformationsEntity;

import com.neo.service.UserService;

@Service

public class UserServiceImpl implements UserService {

@Resource UserDao userDao;

@Resource UserInformationsDao userInformationsDao;

@Override

@Transactional

public void updateUserinfo() {

UserEntity user=new UserEntity();

user.setId(1);

user.setUserName("李四4");

UserInformationsEntity userInfo=new UserInformationsEntity();

userInfo.setUserId(1);

userInfo.setAddress("陕西4");

userDao.updateUser(user);

userInformationsDao.updateUserInformations(userInfo);

if(true){

throw new RuntimeException("test tx ");

}

}

}

在service添加事务后,更新完毕抛出异常,test2更新进行了回滚,test1 数据更新没有回滚。

解决方案添加分布式的事务,Atomikos和spring结合来处理。

Atomikos多数据源的配置

http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-3.0.xsd

http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd

http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">

${database.test1.url}

${database.test1.username}

${database.test1.password}

${database.test2.url}

${database.test2.username}

${database.test2.password}

所有代码请参考这里:

https://github.com/ityouknow/spring-examples

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值