当前位置:   article > 正文

️ 【JAVA实战】手把手教你SpringBoot中事务@Transactional的正确姿势_springboot transactional

springboot transactional

目录

一、事务的定义

二、特点

三、应用场景

四:实战配置

五、总结:


一、事务的定义

在Java中,事务(Transaction)是指作为单个逻辑工作单元执行的一系列操作。当涉及到数据库操作时,事务确保了数据的完整性和一致性,即使在出现故障的情况下也能保证数据的安全。事务的处理通常在数据库管理系统(DBMS)层面进行,但在Java环境中,事务的管理也可以通过编程框架如Spring或Java Transaction API (JTA)来控制。

二、特点

事务具有以下四个主要特性,通常称为ACID特性:

  1. 原子性(Atomicity)

    • 事务是一个不可分割的最小工作单元,事务内的所有操作要么全部成功,要么全部失败回滚。
  2. 一致性(Consistency)

    • 事务开始之前和结束之后,数据库的完整性约束没有被破坏。这意味着事务的执行不会违反任何规则,如外键约束、唯一性约束等。
  3. 隔离性(Isolation)

    • 事务之间相互隔离,一个事务的执行不会受到其他事务的影响。根据不同的隔离级别,事务可以避免脏读、不可重复读和幻读等问题。
  4. 持久性(Durability)

    • 一旦事务提交,它对数据库所做的更改将是永久的,即使在系统故障后也应如此。

三、应用场景

事务在Java应用中通常用于以下几种情况:

  1. 多表更新

    • 当一个业务操作需要同时更新多个表时,使用事务可以确保所有更新要么一起成功,要么一起失败。
  2. 复杂业务流程

    • 在涉及多个步骤的业务流程中,如果其中一个步骤失败,事务可以回滚到开始状态,避免部分操作完成而部分未完成的情况。
  3. 并发控制

    • 在高并发环境下,事务可以帮助控制数据的并发访问,防止数据冲突和不一致。
  4. 批量操作

    • 当需要执行一系列数据库操作时,可以将其封装在一个事务中,减少网络通信次数,提高效率。
  5. 安全性

    • 事务可以提供一定程度的数据安全保护,例如在银行交易、电子商务支付等场景中,确保资金转移的准确性和安全性。

        在Java中,事务的管理可以通过手动的方式使用Connection对象的commit()rollback()方法,也可以通过Spring框架的声明式事务管理来自动处理事务边界。Spring框架允许通过注解(如@Transactional)或XML配置来控制事务的开始和结束,这大大简化了事务的管理。

四:实战配置

        Spring Boot各版本对事务管理的开启和配置方式大体上保持了一致性,但具体实现细节和默认行为可能会随版本的更新而略有不同。下面是一些关键点,说明Spring Boot不同版本中事务管理的主要区别:

Spring Boot1.X版本

  • 在Spring Boot 1.x版本中,事务管理主要通过Spring的@EnableTransactionManagement注解来显式地启用。
  • 你需要在配置类中添加@EnableTransactionManagement注解,以启动Spring的事务管理功能。
  • @Transactional注解用于标记需要事务支持的类或方法。
  • 通常还需要显式配置事务管理器,例如DataSourceTransactionManager,并将其注册到Spring容器中。

启动类配置:

  1. /**
  2. * 启动服务
  3. */
  4. @SpringBootApplication
  5. @RestController
  6. @EnableTransactionManagement //开启事务
  7. public class TestApplication {
  8. public static void main(String[] args) {
  9. SpringApplication.run(TestApplication .class, args);
  10. }
  11. }

开启全局配置:

  1. package com.config;
  2. import org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. import org.springframework.jdbc.datasource.DataSourceTransactionManager;
  7. import org.springframework.transaction.interceptor.TransactionInterceptor;
  8. import javax.persistence.Transient;
  9. import javax.sql.DataSource;
  10. import java.util.Properties;
  11. /**
  12. * Title: 事务配置类
  13. */
  14. @Configuration
  15. public class TxConfigBeanName {
  16. @Autowired(required=true)
  17. @Transient
  18. private DataSourceTransactionManager transactionManager;
  19. @Bean
  20. public DataSourceTransactionManager transactionManager(DataSource dataSource) {
  21. return new DataSourceTransactionManager(dataSource);
  22. }
  23. // 创建事务通知
  24. @Bean(name = "txAdvice")
  25. public TransactionInterceptor getAdvisor() {
  26. Properties properties = new Properties();
  27. properties.setProperty("add*", "PROPAGATION_REQUIRED,-ServiceException");
  28. properties.setProperty("save*", "PROPAGATION_REQUIRED,-ServiceException");
  29. properties.setProperty("modify*", "PROPAGATION_REQUIRED,-ServiceException");
  30. properties.setProperty("update*", "PROPAGATION_REQUIRED,-ServiceException");
  31. properties.setProperty("delete*", "PROPAGATION_REQUIRED,-ServiceException");
  32. properties.setProperty("*Delete*", "PROPAGATION_REQUIRED,-ServiceException");
  33. properties.setProperty("disable*", "PROPAGATION_REQUIRED,-ServiceException");
  34. properties.setProperty("enable*", "PROPAGATION_REQUIRED,-ServiceException");
  35. properties.setProperty("handle*", "PROPAGATION_REQUIRED,-ServiceException");
  36. // properties.setProperty("*", "PROPAGATION_REQUIRED,-ServiceException,readOnly");
  37. TransactionInterceptor tsi = new TransactionInterceptor(transactionManager,properties);
  38. return tsi;
  39. }
  40. @Bean
  41. public BeanNameAutoProxyCreator txProxy() {
  42. BeanNameAutoProxyCreator creator = new BeanNameAutoProxyCreator();
  43. creator.setInterceptorNames("txAdvice");
  44. creator.setBeanNames("*Service", "*ServiceImpl");
  45. creator.setProxyTargetClass(true);
  46. return creator;
  47. }
  48. }

@Transactional应用

  1. @Transactional(rollbackFor = Exception.class)
  2. public void save(test vo) {
  3. saveTest(vo);//保存主表
  4. saveItem(vo.getItem());//保存子表
  5. }

Spring Boot 2.x 版本

  • Spring Boot 2.x系列进一步增强了自动配置能力,对于事务管理也是如此。
  • 默认情况下,如果应用程序使用了Spring Data JPA或其他Spring Data模块,Spring Boot会自动配置JpaTransactionManager或相应的事务管理器。
  • @EnableTransactionManagement注解在大多数情况下不再是必需的,因为事务管理的自动配置会自动包含它。
  • 开发者仍然可以在需要的地方使用@Transactional注解来控制事务的范围和行为。

开启全局配置:

  1. package com.config;
  2. import org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. import org.springframework.jdbc.datasource.DataSourceTransactionManager;
  7. import org.springframework.transaction.interceptor.TransactionInterceptor;
  8. import javax.persistence.Transient;
  9. import javax.sql.DataSource;
  10. import java.util.Properties;
  11. /**
  12. * Title: 事务配置类
  13. */
  14. @Configuration
  15. public class TxConfigBeanName {
  16. @Autowired(required=true)
  17. @Transient
  18. private DataSourceTransactionManager transactionManager;
  19. @Bean
  20. public DataSourceTransactionManager transactionManager(DataSource dataSource) {
  21. return new DataSourceTransactionManager(dataSource);
  22. }
  23. // 创建事务通知
  24. @Bean(name = "txAdvice")
  25. public TransactionInterceptor getAdvisor() {
  26. Properties properties = new Properties();
  27. properties.setProperty("add*", "PROPAGATION_REQUIRED,-ServiceException");
  28. properties.setProperty("save*", "PROPAGATION_REQUIRED,-ServiceException");
  29. properties.setProperty("modify*", "PROPAGATION_REQUIRED,-ServiceException");
  30. properties.setProperty("update*", "PROPAGATION_REQUIRED,-ServiceException");
  31. properties.setProperty("delete*", "PROPAGATION_REQUIRED,-ServiceException");
  32. properties.setProperty("*Delete*", "PROPAGATION_REQUIRED,-ServiceException");
  33. properties.setProperty("disable*", "PROPAGATION_REQUIRED,-ServiceException");
  34. properties.setProperty("enable*", "PROPAGATION_REQUIRED,-ServiceException");
  35. properties.setProperty("handle*", "PROPAGATION_REQUIRED,-ServiceException");
  36. // properties.setProperty("*", "PROPAGATION_REQUIRED,-ServiceException,readOnly");
  37. TransactionInterceptor tsi = new TransactionInterceptor(transactionManager,properties);
  38. return tsi;
  39. }
  40. @Bean
  41. public BeanNameAutoProxyCreator txProxy() {
  42. BeanNameAutoProxyCreator creator = new BeanNameAutoProxyCreator();
  43. creator.setInterceptorNames("txAdvice");
  44. creator.setBeanNames("*Service", "*ServiceImpl");
  45. creator.setProxyTargetClass(true);
  46. return creator;
  47. }
  48. }

@Transactional应用

  1. @Transactional(rollbackFor = Exception.class)
  2. public void save(test vo) {
  3. saveTest(vo);//保存主表
  4. saveItem(vo.getItem());//保存子表
  5. }

五、总结:

        以上即为SpringBoot的事务开启、配置与使用方式!对你有所帮助,关注博主或点个赞再走吧!更多资源也可关注微信公众号获取!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/995273
推荐阅读
相关标签
  

闽ICP备14008679号