
org.springframework.boot spring-boot-starter-jta-atomikos
##account表数据库配置 spring.atomikos.datasource.account.max-pool-size=25 spring.atomikos.datasource.account.min-pool-size=3 spring.atomikos.datasource.account.max-lifetime=20000 spring.atomikos.datasource.account.borrow-connection-timeout=10000 spring.atomikos.datasource.account.unique-resource-name=account spring.atomikos.datasource.account.xa-properties.url=jdbc:mysql://192.168.0.138:3307/xa_account?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC spring.atomikos.datasource.account.xa-properties.username=root spring.atomikos.datasource.account.xa-properties.password=agan spring.atomikos.datasource.account.xa-properties.driverClassName=com.mysql.jdbc.Driver # 初始化大小,最小,最大 spring.atomikos.datasource.account.xa-properties.initialSize=10 spring.atomikos.datasource.account.xa-properties.minIdle=20 spring.atomikos.datasource.account.xa-properties.maxActive=100 ## 配置获取连接等待超时的时间 spring.atomikos.datasource.account.xa-properties.maxWait=60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 spring.atomikos.datasource.account.xa-properties.timeBetweenEvictionRunsMillis=60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 spring.atomikos.datasource.account.xa-properties.minEvictableIdleTimeMillis=300000 spring.atomikos.datasource.account.xa-properties.testWhileIdle=true spring.atomikos.datasource.account.xa-properties.testonBorrow=false spring.atomikos.datasource.account.xa-properties.testonReturn=false # 打开PSCache,并且指定每个连接上PSCache的大小 spring.atomikos.datasource.account.xa-properties.poolPreparedStatements=true spring.atomikos.datasource.account.xa-properties.maxPoolPreparedStatementPerConnectionSize=20 # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 spring.atomikos.datasource.account.xa-properties.filters=stat,slf4j,wall spring.atomikos.datasource.account.xa-data-source-class-name=com.alibaba.druid.pool.xa.DruidXADataSource #------------------------------ 分隔符------------------------------------- ##redpacket表数据库配置 spring.atomikos.datasource.redpacket.max-pool-size=25 spring.atomikos.datasource.redpacket.min-pool-size=3 spring.atomikos.datasource.redpacket.max-lifetime=20000 spring.atomikos.datasource.redpacket.borrow-connection-timeout=10000 spring.atomikos.datasource.redpacket.unique-resource-name=redpacket spring.atomikos.datasource.redpacket.xa-properties.url=jdbc:mysql://192.168.0.138:3308/xa_red_account?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC spring.atomikos.datasource.redpacket.xa-properties.username=root spring.atomikos.datasource.redpacket.xa-properties.password=agan spring.atomikos.datasource.redpacket.xa-properties.driverClassName=com.mysql.jdbc.Driver spring.atomikos.datasource.redpacket.xa-properties.initialSize=10 spring.atomikos.datasource.redpacket.xa-properties.minIdle=20 spring.atomikos.datasource.redpacket.xa-properties.maxActive=100 spring.atomikos.datasource.redpacket.xa-properties.maxWait=60000 spring.atomikos.datasource.redpacket.xa-properties.timeBetweenEvictionRunsMillis=60000 spring.atomikos.datasource.redpacket.xa-properties.minEvictableIdleTimeMillis=300000 spring.atomikos.datasource.redpacket.xa-properties.testWhileIdle=true spring.atomikos.datasource.redpacket.xa-properties.testonBorrow=false spring.atomikos.datasource.redpacket.xa-properties.testonReturn=false spring.atomikos.datasource.redpacket.xa-properties.poolPreparedStatements=true spring.atomikos.datasource.redpacket.xa-properties.maxPoolPreparedStatementPerConnectionSize=20 # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 spring.atomikos.datasource.redpacket.xa-properties.filters=stat,slf4j,wall spring.atomikos.datasource.redpacket.xa-data-source-class-name=com.alibaba.druid.pool.xa.DruidXADataSource #jta相关参数配置 #spring.jta.transaction-manager-id=txManager #spring.jta.log-dir=transaction-logs-agan logging.level.root=INFO
@Configuration
@EnableConfigurationProperties
@EnableTransactionManagement(proxyTargetClass = true)
public class MybatisConfiguration {
final static String ACCOUNT_PREFIX = "spring.atomikos.datasource.account";
final static String REDPACKET_PREFIX = "spring.atomikos.datasource.redpacket";
final static Logger logger = LoggerFactory.getLogger(MybatisConfiguration.class);
@Bean
public ServletRegistrationBean druidServlet() {
logger.info("Init Druid Servlet Configuration ");
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid
@Bean
public FilterRegistrationBean filterRegistrationBean() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
//添加过滤规则
filterRegistrationBean.addUrlPatterns("
@Bean(name = "AccountDataSource")
@ConfigurationProperties(prefix = ACCOUNT_PREFIX) // application.properties中对应属性的前缀
public DataSource accountDataSource() {
return new AtomikosDataSourceBean();
}
@Bean(name = "RedPacketDataSource")
@ConfigurationProperties(prefix = REDPACKET_PREFIX) // application.properties中对应属性的前缀
public DataSource redPacketDataSource() {
return new AtomikosDataSourceBean();
}
}
@Configuration
@MapperScan(basePackages = {"com.agan.dtp.atomikos.mapper.account.mapper"}, sqlSessionFactoryRef = "accountSqlSessionFactory")
public class AccountDataSourceConfiguration {
public static final String MAPPER_XML_LOCATION = "classpath*:com/agan/dtp/atomikos/mapper/account/mapper
@Autowired
@Qualifier("AccountDataSource")
DataSource accountDataSource;
@Bean
public SqlSessionTemplate springSqlSessionTemplate() throws Exception {
return new SqlSessionTemplate(accountSqlSessionFactory());
}
@Bean
public SqlSessionFactory accountSqlSessionFactory() throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(accountDataSource);
//指定XML文件路径
factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MAPPER_XML_LOCATION));
return factoryBean.getObject();
}
}
@Service
public class PayServiceImpl implements PayService {
@Autowired
private CapitalAccountMapper capitalAccountMapper;
@Autowired
private RedPacketAccountMapper redPacketAccountMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public void pay(int userId,int account, int redAccount) {
CapitalAccount ca=new CapitalAccount();
ca.setUserId(userId);
CapitalAccount capitalDTO=this.capitalAccountMapper.selectOne(ca);
System.out.println(capitalDTO);
//账户余额扣除
capitalDTO.setBalanceAmount(capitalDTO.getBalanceAmount()-account);
this.capitalAccountMapper.updateByPrimaryKey(capitalDTO);
RedPacketAccount red= new RedPacketAccount();
red.setUserId(userId);
RedPacketAccount redDTO=this.redPacketAccountMapper.selectOne(red);
System.out.println(redDTO);
//红包余额扣除
redDTO.setBalanceAmount(redDTO.getBalanceAmount()-redAccount);
this.redPacketAccountMapper.updateByPrimaryKey(redDTO);
//int n=9/0;
}
}
两个事务会同时提交和回滚
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)