Spring事务管理整理

只读属性

对于单纯读取数据库操作, 可以设置readOnly=true, 可以提高数据的放效率.

如:

@Transactional(readOnly=true)
public List<Map<String, Object>> listNotesInTrashBin(
        String userId) throws UserNotFoundException {

事务的传播

业务过程重构时候需要业务方法调用业务方法, 这样就需要一个业务方法的事务传播到另外一个业务方法中, 整合为一个事务.

事务传播(propagation)属性

  1. @Transactional(propagation=Propagation.REQUIRED)
    • 需要事务, 如果没有事务创建新事务, 如果当前有事务参与当前事务
  2. @Transactional(propagation=Propagation.MANDATORY)
    • 必须有事务, 如果当前没有事务就抛异常
  3. @Transactional(propagation=Propagation.NEVER)
    • 绝不, 绝对不能有事务, 如果在事务中调用则抛出异常
  4. @Transactional(propagation=Propagation.NESTED)
    • 嵌套, 必须被嵌套到其他事务中
  5. @Transactional(propagation=Propagation.NOT_SUPPORTED)
    • 不支持事务
  6. @Transactional(propagation=Propagation.SUPPORTS)
    • 支持事务, 如果没有事务也不会创建新事务
  7. @Transactional(propagation=Propagation.REQUIRES_NEW)
    • 必须是新事务, 如果有当前事务, 挂起当前事务并且开启新事务.

事务隔离属性

一共有4种, 一般采用 @Transactional(isolation=Isolation.READ_COMMITTED) 级别, 是并发性能和安全性折中的选择. 是大多数软件项目采用的隔离级别.

声明式事务

就是所有业务方法使用@Transactional, 如果是只读方法, 建议增加readOnly=true

转载于:https://www.cnblogs.com/ka-bu-qi-nuo/p/7383043.html

<think>好的,我需要详细整理一下Spring事务管理的知识点。首先,我得回忆一下Spring事务管理的基本概念,可能涉及核心接口、事务传播行为、隔离级别、配置方式等等。然后要分门别类地组织这些内容,确保覆盖所有重要的方面。 首先,Spring事务管理有两种方式:编程式事务和声明式事务。声明式事务更常用,可能基于注解或XML配置。核心接口比如PlatformTransactionManager,还有它的实现类,比如DataSourceTransactionManager、HibernateTransactionManager等,这些需要提到。 接下来是事务的传播行为,比如REQUIRED、REQUIRES_NEW、NESTED等,每个传播行为的含义和应用场景需要解释清楚。然后是隔离级别,像读未提交、读已提交、可重复读、串行化,还有Spring默认的隔离级别可能是什么。 另外,事务的回滚规则也很重要,默认情况下回滚哪些异常,如何自定义回滚异常。还有事务的超时设置和只读属性,这些属性如何影响事务的性能和操作。 基于注解的配置方式,比如@Transactional注解的使用位置,方法级别还是类级别,以及不同位置的优先级。可能还需要说明在Spring Boot中如何启用事务管理,通常是通过@EnableTransactionManagement注解,不过可能Spring Boot自动配置已经处理了这一点。 还有需要提到的是事务的AOP代理机制,因为声明式事务是基于AOP实现的,可能会涉及动态代理,以及在某些情况下自调用的问题,比如同一个类中一个方法调用另一个有@Transactional注解的方法时,事务不生效的情况。 另外,可能还需要比较不同的事务管理器,比如JDBC、JPA、JTA等场景下使用的事务管理器区别,以及分布式事务的处理,比如使用JtaTransactionManager。 最后,可能还要讲一些最佳实践,比如如何选择传播行为和隔离级别,常见的陷阱和解决方案,比如异常被捕获导致事务不回滚的情况,或者检查型异常和非检查型异常的区别处理。 可能还需要整理一些示例代码,展示如何在Spring Boot中使用@Transactional注解配置事务,或者如何在XML中配置声明式事务。不过用户可能只需要知识点的整理,不需要具体代码。 现在,我需要把这些内容结构化和详细化,确保逻辑清晰,涵盖所有关键点。可能需要分几个大点,每个大点下有子点,用标题和列表来组织,便于阅读。同时要注意术语的准确性,比如传播行为的名称和对应的PROPAGATION_前缀,不过在Spring中可能用的是枚举类型的值,比如Propagation.REQUIRED。 还要注意事务的边界,声明式事务如何界定,基于AOP的切入点配置。另外,事务同步和资源本地事务的管理,比如如何确保Hibernate的Session或JDBC的Connection与事务同步。 可能还要提到事务的事件监听,比如使用@TransactionalEventListener来处理事务相关的事件,在事务提交后执行某些操作。 总之,需要全面但不过于冗长,结构清晰,分点说明,每个部分有足够的细节但保持简洁。需要检查是否有遗漏的重要概念,比如事务的保存点(Savepoint)在嵌套事务中的应用,或者不同数据库对隔离级别的支持情况可能不同,需要注意这些细节是否值得包含。 最后,可能总结一下Spring事务管理的优势,比如解耦业务逻辑和事务管理,提供一致的事务抽象层,支持多种数据访问技术等。</think>以下是 Spring 事务管理的详细知识点整理,涵盖核心概念、配置方式、传播行为、隔离级别等关键内容: --- ### **一、Spring 事务管理核心概念** 1. **事务管理器接口** - **`PlatformTransactionManager`** 所有事务策略的顶级接口,核心方法: ```java TransactionStatus getTransaction(TransactionDefinition definition); void commit(TransactionStatus status); void rollback(TransactionStatus status); ``` - **常见实现类** - `DataSourceTransactionManager`:用于 JDBC 或 MyBatis(基于 Connection)。 - `HibernateTransactionManager`:用于 Hibernate。 - `JpaTransactionManager`:用于 JPA。 - `JtaTransactionManager`:分布式事务(如多数据源或跨服务)。 2. **事务定义接口** - **`TransactionDefinition`** 定义事务属性:传播行为、隔离级别、超时时间、是否只读等。 3. **事务状态接口** - **`TransactionStatus`** 提供事务运行状态(如是否为新事务、是否有保存点)和控制事务(如设置回滚)的方法。 --- ### **二、事务配置方式** 1. **编程式事务管理** - 通过 `TransactionTemplate` 或直接使用 `PlatformTransactionManager` 手动控制事务。 - **示例**: ```java transactionTemplate.execute(status -> { try { // 业务逻辑 return result; } catch (Exception e) { status.setRollbackOnly(); return null; } }); ``` 2. **声明式事务管理(推荐)** - 基于 **AOP** 实现,通过注解或 XML 配置将事务规则与业务逻辑解耦。 - **注解方式**: - **`@Transactional`** 标注在类或方法上。 - **启用事务管理**:在配置类添加 `@EnableTransactionManagement`(Spring Boot 自动配置默认启用)。 - **XML 方式**: ```xml <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="save*" propagation="REQUIRED"/> </tx:attributes> </tx:advice> <aop:config> <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.example.service.*.*(..))"/> </aop:config> ``` --- ### **三、事务传播行为(Propagation)** 定义事务方法之间的调用关系,通过 `@Transactional(propagation = Propagation.REQUIRED)` 配置: | 传播行为 | 说明 | |-------------------------|--------------------------------------------------------------------| | **REQUIRED**(默认) | 当前存在事务则加入,否则新建一个事务。 | | **REQUIRES_NEW** | 始终新建事务,若当前存在事务则挂起。 | | **SUPPORTS** | 当前存在事务则加入,否则以非事务方式运行。 | | **NOT_SUPPORTED** | 以非事务方式运行,若当前存在事务则挂起。 | | **MANDATORY** | 强制要求当前存在事务,否则抛出异常。 | | **NEVER** | 强制要求当前不存在事务,否则抛出异常。 | | **NESTED** | 在当前事务中嵌套子事务(使用保存点),子事务可独立提交或回滚(仅部分数据库支持,如 MySQL 的 InnoDB)。 | --- ### **四、事务隔离级别(Isolation)** 通过 `@Transactional(isolation = Isolation.DEFAULT)` 配置,解决并发问题(脏读、不可重复读、幻读): | 隔离级别 | 说明 | |--------------------------|--------------------------------------------------------------------| | **DEFAULT** | 使用数据库默认隔离级别(如 MySQL 默认为 REPEATABLE_READ)。 | | **READ_UNCOMMITTED** | 读未提交,可能发生脏读、不可重复读、幻读。 | | **READ_COMMITTED** | 读已提交(Oracle 默认),避免脏读。 | | **REPEATABLE_READ** | 可重复读(MySQL 默认),避免脏读、不可重复读。 | | **SERIALIZABLE** | 串行化,避免所有并发问题,但性能最低。 | --- ### **五、事务其他属性** 1. **回滚规则** - **默认回滚**:运行时异常(`RuntimeException`)和错误(`Error`)。 - **自定义回滚异常**: ```java @Transactional(rollbackFor = CustomException.class) ``` - **不回滚异常**: ```java @Transactional(noRollbackFor = SQLException.class) ``` 2. **超时时间** - `@Transactional(timeout = 30)`:事务超时时间(秒),超时强制回滚。 3. **只读事务** - `@Transactional(readOnly = true)`:优化数据库操作(如查询时启用只读模式)。 --- ### **六、常见问题与解决方案** 1. **事务不生效场景** - 自调用问题:同类中非事务方法调用 `@Transactional` 方法(需通过 AOP 代理对象调用)。 - 异常被捕获:未将异常抛出或未配置 `rollbackFor`。 - 非 public 方法:`@Transactional` 注解在非 public 方法上失效。 2. **分布式事务** - 使用 `JtaTransactionManager` 或 Seata、Atomikos 等框架支持多数据源事务。 --- ### **七、最佳实践** 1. **注解位置**:优先标注在具体方法而非类上,避免不必要的事务扩散。 2. **事务粒度**:避免在事务中包含大量耗时操作,影响并发性能。 3. **检查异常处理**:默认不回滚检查型异常(如 `IOException`),需显式配置 `rollbackFor`。 --- ### **总结** Spring 事务管理通过统一抽象(`PlatformTransactionManager`)支持多种数据访问技术,结合声明式事务(`@Transactional`)简化开发,同时提供灵活的传播行为、隔离级别等配置选项。理解其底层机制(如 AOP 代理)和常见问题,能有效避免事务失效等陷阱。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值