网络安全最新JPA+Jta-atomikos实现分布式事务(1),2024互联网大厂网络安全面经合集

给大家的福利

零基础入门

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

同时每个成长路线对应的板块都有配套的视频提供:

在这里插入图片描述

因篇幅有限,仅展示部分资料

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

 * 商品实体类管理工厂
 */
@Primary
@Bean(name = "goodsEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean goodsEntityManagerFactory(EntityManagerFactoryBuilder builder) {
    return builder.dataSource(goodsDataSource())
            .properties(jpaProperties.getProperties())
            //设置实体类所在位置:类或包
            .packages("com.yyg.boot.entity.db1")
            //持久化单元名称
            .persistenceUnit("goodsPersistenceUnit")
            .build();
}

/**
 * 商品事务管理器
 */
@Primary
@Bean(name = "goodsTransactionManager")
public PlatformTransactionManager goodsTransactionManager(EntityManagerFactoryBuilder builder) {
    return new JpaTransactionManager(Objects.requireNonNull(goodsEntityManagerFactory(builder).getObject()));
}

}


**db4数据源配置类GoodsDataSourceConfig**



package com.yyg.boot.config;

import com.alibaba.druid.pool.xa.DruidXADataSource;
import com.atomikos.jdbc.AtomikosDataSourceBean;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;

import javax.annotation.Resource;
import javax.sql.DataSource;
import java.util.Objects;

/**

  • @Author 一一哥Sun

  • @Date Created in 2020/4/18

  • @Description 商品数据源配置类
    */
    @Configuration
    @EnableJpaRepositories(basePackages = {“com.yyg.boot.dao.db02”},entityManagerFactoryRef = “userEntityManagerFactory”,transactionManagerRef = “userTransactionManager”)
    public class UserDataSourceConfig {

    /**

    • 自动注入jpa配置
      */
      @Resource
      private JpaProperties jpaProperties;

    @Bean(name = “userDataSource”)
    public DataSource db4DataSource() {
    DruidXADataSource druidXADataSource = new DruidXADataSource();
    druidXADataSource.setUrl(“jdbc:mysql://localhost:3306/db4?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC”);
    druidXADataSource.setUsername(“root”);
    druidXADataSource.setPassword(“syc”);
    druidXADataSource.setDefaultAutoCommit(false);

     AtomikosDataSourceBean atomikosDataSourceBean = new AtomikosDataSourceBean();
     atomikosDataSourceBean.setXaDataSource(druidXADataSource);
     atomikosDataSourceBean.setUniqueResourceName("userDataSource");
     atomikosDataSourceBean.setPoolSize(5);
    
     return atomikosDataSourceBean;
    

    }

    /**

    • 将数据源、连接池、以及其他配置策略进行封装返回给事务管理器
    • 自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常
      */
      @Bean(name = “userEntityManagerFactory”)
      public LocalContainerEntityManagerFactoryBean userEntityManagerFactory(EntityManagerFactoryBuilder builder){
      return builder.dataSource(db4DataSource())
      .properties(jpaProperties.getProperties())
      //设置实体类所在位置:类或包
      .packages(“com.yyg.boot.entity.db2”)
      //持久化单元名称
      .persistenceUnit(“userPersistenceUnit”)
      .build();
      }

    /**

    • 返回数据源的事务管理器
      */
      @Bean(name = “userTransactionManager”)
      public PlatformTransactionManager userTransactionManager(EntityManagerFactoryBuilder builder){
      return new JpaTransactionManager(Objects.requireNonNull(userEntityManagerFactory(builder).getObject()));
      }

}


**创建用来整合多数据源的事务管理器JtaTransactionManager**



package com.yyg.boot.config;

import com.atomikos.icatch.jta.UserTransactionImp;
import com.atomikos.icatch.jta.UserTransactionManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.transaction.jta.JtaTransactionManager;

import javax.transaction.UserTransaction;

/**

  • @Author 一一哥Sun

  • @Date Created in 2020/4/19

  • @Description Description
    */
    @Configuration
    public class JtaTransactionManagerConfig {

    @Primary
    @Bean(name = “jtaTransactionManager”)
    public JtaTransactionManager regTransactionManager () {
    UserTransactionManager userTransactionManager = new UserTransactionManager();
    UserTransaction userTransaction = new UserTransactionImp();
    return new JtaTransactionManager(userTransaction, userTransactionManager);
    }

}


#### **7. 创建Service及其实现类**



> 
> *注意:*
>   
> 
> *此处一定要通过@Transactional注解来明确指明所用的事务管理器,否则当多数据源时可能只能执行一个数据里的增删改操作,且此处应该设置Spring的事务传播属性为propagation =Propagation.NEVER,不使用单个数据源自己的事务,统一交由jtaTransactionManager的事务来管理。*
> 


**定义GoodsService接口**



package com.yyg.boot.service;

import com.yyg.boot.entity.db1.Goods;

import java.util.List;

/**

  • @Author 一一哥Sun

  • @Date Created in 2020/4/7

  • @Description Description
    */
    public interface GoodsService {

    List findAll();

    Goods addGoods(Goods goods);

}


**GoodsServiceImpl实现**



package com.yyg.boot.service.impl;

import com.yyg.boot.dao.db01.GoodsRepository;
import com.yyg.boot.entity.db1.Goods;
import com.yyg.boot.service.GoodsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;

import java.util.List;

/**

  • @Author 一一哥Sun

  • @Date Created in 2020/4/7

  • @Description Description

  • 注意:此处一定要通过@Transactional注解来明确指明所用的事务管理器,否则当多数据源时可能只能执行一个数据里的增删改操作.

  • 且此处应该设置Spring的事务传播属性为propagation =Propagation.NEVER,不使用单个数据源自己的事务,统一交由jtaTransactionManager的事务来管理.
    */
    @Service
    @Transactional(transactionManager = “goodsTransactionManager”,rollbackFor = Exception.class,propagation =Propagation.NEVER)
    public class GoodsServiceImpl implements GoodsService {

    @Autowired
    private GoodsRepository goodsRepository;

    @Override
    public List findAll() {
    return goodsRepository.findAll();
    }

    @Override
    public Goods addGoods(Goods goods) {
    try {
    return goodsRepository.save(goods);
    }catch (Exception e){
    //强制手动事务回滚
    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
    }
    return null;
    }

}


**定义UserService接口**



package com.yyg.boot.service;

import com.yyg.boot.entity.db2.User;

import java.util.List;

/**

  • @Author 一一哥Sun

  • @Date Created in 2020/4/7

  • @Description Description
    */
    public interface UserService {

    List findAll();

    User addUser(User user);

}


**UserServiceImpl实现**



package com.yyg.boot.service.impl;

import com.yyg.boot.dao.db02.UserRepository;
import com.yyg.boot.entity.db2.User;
import com.yyg.boot.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;

import java.util.List;

/**

  • @Author 一一哥Sun

  • @Date Created in 2020/4/7

  • @Description Description

  • 注意:此处一定要通过@Transactional注解来明确指明所用的事务管理器,否则当多数据源时可能只能执行一个数据里的增删改操作.

  • 且此处应该设置Spring的事务传播属性为propagation =Propagation.NEVER,不使用单个数据源自己的事务,统一交由jtaTransactionManager的事务来管理.
    */
    @Service
    @Transactional(transactionManager = “userTransactionManager”,rollbackFor = Exception.class,propagation =Propagation.NEVER)
    public class UserServiceImpl implements UserService {

    @Autowired
    private UserRepository userRepository;

    @Override
    public List findAll() {
    return userRepository.findAll();
    }

    @Override
    public User addUser(User user) {
    try {
    return userRepository.save(user);
    }catch (Exception e){
    //强制手动事务回滚
    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
    }
    return null;
    }

}


#### **8. 创建Controller进行测试**



package com.yyg.boot.web;

import com.yyg.boot.entity.db1.Goods;
import com.yyg.boot.entity.db2.User;
import com.yyg.boot.service.GoodsService;
import com.yyg.boot.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;

/**

  • @Author 一一哥Sun

  • @Date Created in 2020/4/3

  • @Description Description
    */
    @RestController
    public class TransactionController {

    @Autowired
    private UserService userService;

    @Autowired
    private GoodsService goodsService;

    @Transactional(value = “jtaTransactionManager”, rollbackFor = Exception.class)
    @GetMapping(“/add”)
    public ResponseEntity addTest() {
    Goods goods = new Goods();
    goods.setId(44L);
    goods.setName(“iPhone se”);
    goodsService.addGoods(goods);

     User user = new User();
     user.setSex("男");
     user.setUsername("一一哥");
     user.setAddress("上海");
     user.setBirthday(new Date());
     userService.addUser(user);
    
     return ResponseEntity.ok("添加成功");
    

    }

//在该接口中故意制造一个除零异常
@Transactional(value = “jtaTransactionManager”, rollbackFor = Exception.class)
@GetMapping(“/add2”)
public ResponseEntity addTest2() {
Goods goods = new Goods();
goods.setId(44L);
goods.setName(“iPhone se”);
goodsService.addGoods(goods);

    User user = new User();
    user.setSex("男");
    user.setUsername("一一哥");
    user.setAddress("上海");
    user.setBirthday(new Date());
    userService.addUser(user);

    int i=10/0;

    return ResponseEntity.ok("添加成功");
}

}


#### **9. 创建入口类**



package com.yyg.boot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.transaction.annotation.EnableTransactionManagement;

/**

  • @Author 一一哥Sun

  • @Date Created in 2020/4/18

  • @Description Description

  • (exclude = {DataSourceAutoConfiguration.class,DataSourceTransactionManagerAutoConfiguration.class})
    */
    @SpringBootApplication
    //手动进行事务管理
    @EnableTransactionManagement
    public class TransactionApplication {

    public static void main(String[] args){
    SpringApplication.run(TransactionApplication.class,args);
    }

}


#### **10. 完整代码结构**


![](https://img-blog.csdnimg.cn/c607e0ecb55a4b3a8ea215c17b904390.png)


 


![](https://img-blog.csdnimg.cn/cd8b3a2311034ef8b4a05da3f619d2d7.png)


### **11. 启动项目进行测试**


**测试add接口**


![](https://img-blog.csdnimg.cn/f62dfa87c00243e8a6e4893853cc6aec.png)


可以看到,当插入数据没有异常发生时,两个数据库都可以正常插入数据。


![](https://img-blog.csdnimg.cn/2ae8a840f4d648ceb5b7c953ce0d38af.png)


 


![](https://img-blog.csdnimg.cn/d4ae6c9746094ee6bf320a821fa08f88.png)


 


**测试add2接口**


![](https://img-blog.csdnimg.cn/f59f5f22212449e79685e68926ad3a5e.png)


因为我在add2接口中故意制造了一个除零异常,此时代码会发生异常。


![](https://img-blog.csdnimg.cn/img_convert/f4995b74d22859062cadfa75e3ab578f.png)


我们再看数据库中,会发现并没有产生新数据,还是和之前的数据一样,说明多数据源环境下,利用jta-atomikos实现了分布式事务的代码实现。


**先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7**

**深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。**
![img](https://img-blog.csdnimg.cn/img_convert/d4f697c84ee3ebc674a1a7dd9ba37302.png)
![img](https://img-blog.csdnimg.cn/img_convert/4ad32462c6fdd56426adc8fc103b69c3.png)
![img](https://img-blog.csdnimg.cn/img_convert/c5f7b5caf407f72f8738f12c44e5c953.png)
![img](https://img-blog.csdnimg.cn/img_convert/386423a73549ff97b41e14b10436462a.png)
![img](https://img-blog.csdnimg.cn/img_convert/19c2c48db69264237fe9c7a50e32f303.png)
![img](https://img-blog.csdnimg.cn/img_convert/9edb884ea76b5d0bb27d3d2ba4198653.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**

,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。**
[外链图片转存中...(img-xkmR5fFq-1715274108141)]
[外链图片转存中...(img-jK1XgVMd-1715274108142)]
[外链图片转存中...(img-aHECuuiA-1715274108143)]
[外链图片转存中...(img-QleXeZ1o-1715274108143)]
[外链图片转存中...(img-vQZ3vXll-1715274108144)]
[外链图片转存中...(img-pfp0VqZZ-1715274108144)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值