Spring的7种事务传播行为分析实例(一)

偏执的太偏执、 2021-12-11 07:01 416阅读 0赞

今天任务不多,闲来没事的时候看到一篇关于事务传播机制的博客,里面除了对7种事务传播机制的介绍和讲解,还谈到了事务的传播机制定义在TransactionDefinition接口中,我们也可以通过枚举类Propagation类调用,然后正好也没事做,我就去看了一下TransactionDefinition接口和Propagation类的源码,看完之后发现里面就是对7种事务传播机制的定义还有几个获取事务的传播行为、隔离级别等的方法,想起面试那时候死记硬背事务的传播机制,到现在还是不知道原理,于是我就想做个demo实战一下,帮助我们进一步理解事务传播机制的原理。

这里关于7种事务传播机制我就不再重复介绍了,大家若有对定义还不清楚的可以自行百度,好了,话不多说,进入正题。

一、新建/导入项目

考虑到做一个小demo,我马上就想到SpringBoot,于是老规矩直接到SpringBoot官网下载一个基本的SpringBoot的demo,当然我们也可以创建一个SpringBoot项目,然后可以开始写实例了。

二、pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.1.6.RELEASE</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.example</groupId>
  12. <artifactId>demo</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>demo</name>
  15. <description>Demo project for Spring Boot</description>
  16. <properties>
  17. <java.version>1.8</java.version>
  18. </properties>
  19. <dependencies>
  20. <dependency>
  21. <groupId>org.springframework.boot</groupId>
  22. <artifactId>spring-boot-starter</artifactId>
  23. </dependency>
  24. <!--添加Test依赖 -->
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-starter-test</artifactId>
  28. <scope>test</scope>
  29. </dependency>
  30. <!--添加Web依赖 -->
  31. <dependency>
  32. <groupId>org.springframework.boot</groupId>
  33. <artifactId>spring-boot-starter-web</artifactId>
  34. </dependency>
  35. <!--添加热部署依赖 -->
  36. <dependency>
  37. <groupId>org.springframework.boot</groupId>
  38. <artifactId>spring-boot-devtools</artifactId>
  39. </dependency>
  40. <!--添加Swagger依赖 -->
  41. <dependency>
  42. <groupId>io.springfox</groupId>
  43. <artifactId>springfox-swagger2</artifactId>
  44. <version>2.7.0</version>
  45. </dependency>
  46. <!--添加Swagger-UI依赖 -->
  47. <dependency>
  48. <groupId>io.springfox</groupId>
  49. <artifactId>springfox-swagger-ui</artifactId>
  50. <version>2.7.0</version>
  51. </dependency>
  52. <!--添加postgresql依赖 -->
  53. <dependency>
  54. <groupId>org.postgresql</groupId>
  55. <artifactId>postgresql</artifactId>
  56. <scope>runtime</scope>
  57. </dependency>
  58. <dependency>
  59. <groupId>org.springframework.boot</groupId>
  60. <artifactId>spring-boot-starter-data-jpa</artifactId>
  61. </dependency>
  62. <dependency>
  63. <groupId>org.springframework.boot</groupId>
  64. <artifactId>spring-boot-starter-data-rest</artifactId>
  65. </dependency>
  66. </dependencies>
  67. <build>
  68. <plugins>
  69. <plugin>
  70. <groupId>org.springframework.boot</groupId>
  71. <artifactId>spring-boot-maven-plugin</artifactId>
  72. </plugin>
  73. </plugins>
  74. </build>
  75. </project>

注:Swagger是一个接口测试工具,我开始使用的数据库是postgresql,后来又改用oracle进行了测试,所以没有用这两个的不用添加它们相关的依赖。

三、application.yml/application.properties

配置数据库,我比较习惯用yml文件,配置如下:

  1. spring:
  2. jpa:
  3. database: oracle
  4. show-sql: true
  5. hibernate:
  6. dialect: org.hibernate.dialect.OracleDialect
  7. datasource:
  8. url: jdbc:oracle:thin:@localhost:1521:orcl
  9. username: root
  10. password: root
  11. driverClassName: oracle.jdbc.driver.OracleDriver
  12. #spring:
  13. # jpa:
  14. # database: postgresql
  15. # show-sql: true
  16. # hibernate:
  17. # ddl-auto: update
  18. # dialect: org.hibernate.dialect.PostgreSQLDialect
  19. # properties:
  20. # hibernate:
  21. # temp:
  22. # use_jdbc_metadata_defaults: false
  23. #database:
  24. # driverClassName: org.postgresql.Driver
  25. #datasource:
  26. # platform: postgres
  27. # url: jdbc:postgresql://localhost:5432/mydb
  28. # username: postgres
  29. # password: 12345

四、创建controller层、service层、dao层以及vo

controller:

  1. @RestController
  2. @RequestMapping("/user/*")
  3. public class UserController {
  4. private final static List<User> userList = new ArrayList<>();
  5. @Autowired
  6. UserRepository userRepository;
  7. @Autowired
  8. BusinessService businessService;
  9. @RequestMapping(value = "/save")
  10. @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, rollbackFor = Exception.class)
  11. public String doA() throws Exception {
  12. User user = new User();
  13. user.setId(6);
  14. user.setName("aaa");
  15. user.setPassword("bbb");
  16. userRepository.save(user);
  17. System.out.println("是否是代理调用,AopUtils.isAopProxy(businessService) : " + AopUtils.isAopProxy(businessService));
  18. System.out.println("是否是cglib类代理调用,AopUtils.isCglibProxy(businessService) : " + AopUtils.isCglibProxy(businessService));
  19. System.out.println("是否是jdk动态接口代理调用,AopUtils.isJdkDynamicProxy(businessService) : "
  20. + AopUtils.isJdkDynamicProxy(businessService));
  21. //使用代理调用方法doB()
  22. businessService.doB();
  23. int i = 1 / 0;// 抛出异常
  24. return "success";
  25. }
  26. @RequestMapping(value = "/userList", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
  27. public List<User> findAll() {
  28. final List<User> resultList = new ArrayList<>();
  29. final Iterable<User> all = userRepository.findAll();
  30. all.forEach(new Consumer<User>() {
  31. @Override
  32. public void accept(User user) {
  33. resultList.add(user);
  34. }
  35. });
  36. return resultList;
  37. }
  38. /*@RequestMapping(value = "/save", produces = MediaType.APPLICATION_JSON_VALUE)
  39. public void create() {
  40. try {
  41. doA();
  42. } catch (Exception e) {
  43. e.printStackTrace();
  44. }
  45. }*/
  46. /*@Transactional(propagation = Propagation.REQUIRES_NEW,isolation=Isolation.DEFAULT,rollbackFor=Exception.class)
  47. public String doB() throws Exception {
  48. User user = new User();
  49. user.setId(7);
  50. user.setName("ccc");
  51. user.setPassword("ddd");
  52. userRepository.save(user);
  53. return "success";
  54. }*/
  55. }

service:

  1. public interface BusinessService {
  2. public String doB();
  3. }
  4. @Service("businessService")
  5. public class BusinessServiceImpl implements BusinessService{
  6. @Autowired
  7. UserRepository userRepository;
  8. @Transactional(propagation = Propagation.REQUIRES_NEW,isolation= Isolation.DEFAULT,rollbackFor=Exception.class)
  9. public String doB() {
  10. User user = new User();
  11. user.setId(7);
  12. user.setName("ccc");
  13. user.setPassword("ddd");
  14. userRepository.save(user);
  15. return "success";
  16. }
  17. }

dao:

  1. @Repository
  2. public interface UserRepository extends CrudRepository<User,Integer> {
  3. }

vo:

  1. @Entity
  2. @Table(name = "USER_")
  3. public class User implements Serializable {
  4. @Id
  5. @Column(name = "ID")
  6. private int id;
  7. @Column(name = "NAME")
  8. private String name;
  9. @Column(name = "PASSWORD")
  10. private String password;
  11. public User() {
  12. }
  13. public User(int id, String name, String password) {
  14. this.id = id;
  15. this.name = name;
  16. this.password = password;
  17. }
  18. public int getId() {
  19. return id;
  20. }
  21. public void setId(int id) {
  22. this.id = id;
  23. }
  24. public String getName() {
  25. return name;
  26. }
  27. public void setName(String name) {
  28. this.name = name;
  29. }
  30. public String getPassword() {
  31. return password;
  32. }
  33. public void setPassword(String password) {
  34. this.password = password;
  35. }
  36. @Override
  37. public String toString() {
  38. return "User{" +
  39. "id='" + id + '\'' +
  40. ", name='" + name + '\'' +
  41. ", password='" + password + '\'' +
  42. '}';
  43. }
  44. }

五、测试

到这里基本上案例已经写好了,已经减少了很多配置和代码了,先来看一下数据库:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MDUyODMz_size_16_color_FFFFFF_t_70

启动SpringBoot项目,先测一下数据库连接有没有问题,在浏览器中输入路径http://localhost:8080/user/userList,如显示出数据说明配置没问题。

上面是准备工作,环境搭建好以后,后面将会对Spring的7种事务传播行为类型进行实例演示。未完待续。。。

发表评论

表情:
评论列表 (有 0 条评论,416人围观)

还没有评论,来说两句吧...

相关阅读