Spring中的@Transactional 放在 类级别 和 方法级别 上有什么不同?

本文详细解释了Spring框架中@Transactional注解用于类级别与方法级别的区别。当应用于类级别时,默认将该类的所有方法纳入事务管理;当应用于方法级别时,则仅对该方法起作用。需要注意的是方法级的设置会覆盖类级别的设置。

Spring中的@Transactional 放在 类级别 和 方法级别 上有什么不同?

转载  2014年02月07日 13:46:12

Spring中的@Transactional 放在类级别 和 方法级别 上有什么不同?

@Transactional放在类级别上是否等同于该类的每个方法都放上了@Transactional?

是的
一般类上这么写

//默认将类中的所有函数纳入事务管理.
@Transactional(readOnly=true) //配置事务 查询使用只读
public Demo{
       //方法的写法 (增删改要写 ReadOnly=false 为可写)
       @Transactiona(propagation=Propagation.REQUIRED,isolation=Isolation.DEFAULT,readOnly=false)
        public void saveUser(){
       }

}
Propagation.REQUIRED :有事务就处于当前事务中,没事务就创建一个事务
isolation=Isolation.DEFAULT:事务数据库的默认隔离级别
readOnly=false:可写 针对 增删改操作

注意:方法的@Transactional会覆盖类上面声明的事务

 
u013034640
<think> 我们参考站内引用已有知识,回答用户关于@Transactional注解加在方法上的区别问题。 1. 根据引用[1]:在上添加@Transactional,表示这个的所有public方法都会开启事务;在方法上添加,则只有该方法开启事务。 2. 引用[2]提到:在同一个中,非public方法或者自调用(即同一个中一个方法调用另一个@Transactional方法)会导致事务不生效,因为Spring事务基于代理。 3. 另外,注意事务的传播行为等属性可以在注解中配置,但无论是类级别还是方法级别方法级别会覆盖类级别的配置(如果方法上都有,方法上的生效)。 因此,我们可以这样回答: 区别一:作用范围不同 - 类级别:作用于该的所有public方法。 - 方法级别:仅作用于该方法区别二:配置覆盖 - 如果方法上都有@Transactional,那么方法上的配置会覆盖上的配置(例如传播行为、隔离级别等)。 区别三:使用建议 - 如果整个的所有public方法都需要事务(比如Service层的所有方法),那么可以放在上,避免每个方法都写。 - 如果只有部分方法需要事务,则放在方法上更精确。 同时注意:事务注解只对public方法生效,且要避免自调用。 我们参考引用[1][2]来支持回答。 最后,生成相关问题。 </think>### MyBatis-Plus 中 `@Transactional` 注解在方法上的区别 在 MyBatis-Plus 中开启事务时,`@Transactional` 注解的放置位置会影响事务的作用范围行为机制,具体区别如下: #### 一、作用范围差异 | **位置** | **作用范围** | **示例代码** | |----------------|---------------------------------|-----------------------------------------------------------------------------| | **上** | 当前所有 `public` 方法 | ```java<br>@Service<br>@Transactional // 所有public方法开启事务<br>public class UserService { ... }<br>``` | | **方法上** | 仅当前方法 | ```java<br>public class UserService {<br> @Transactional // 仅此方法开启事务<br> public void update() { ... }<br>}``` | #### 二、优先级与覆盖规则 1. **方法级优先** 若方法同时有注解,**方法级配置会覆盖级配置**: ```java @Transactional(propagation = Propagation.REQUIRED) // 级配置 public class UserService { @Transactional(propagation = Propagation.REQUIRES_NEW) // 方法级配置(覆盖级) public void criticalUpdate() { ... } } ``` 2. **属性继承机制** 方法未配置的属性会继承级注解配置: ```java @Transactional(timeout = 30) // 级超时配置 public class OrderService { @Transactional // 继承timeout=30 public void createOrder() { ... } } ``` #### 三、实际应用场景对比 | **场景** | **级注解** | **方法级注解** | |------------------------------|---------------------|---------------------| | 全方法需事务 | ✅ 推荐 | ❌ 需逐个添加 | | 仅部分方法需事务 | ❌ 不适用 | ✅ 精准控制 | | 需要差异化事务配置 | ❌ 灵活性不足 | ✅ 独立配置传播行为 | | 避免自调用事务失效 | ⚠️ 需配合AOP代理 | ⚠️ 需配合AOP代理 | > **关键注意**(引用[2]): > **自调用事务失效问题**: > 同方法A(无事务)调用方法B(有`@Transactional`),事务不生效。 > 原因:Spring事务基于动态代理,自调用不经过代理[^2]。 #### 四、配置建议 1. **推荐方法级注解** 多数场景下使用方法级注解,更精准控制事务边界: ```java public class AccountService { // 只读事务 @Transactional(readOnly = true) public Account getAccount(Long id) { ... } // 读写事务(独立传播行为) @Transactional(propagation = Propagation.REQUIRES_NEW) public void transfer() { ... } } ``` 2. **级注解适用场景** 当中所有方法需要**相同事务配置**时使用: ```java @Service @Transactional( isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class // 对Exception也回滚[^4] ) public class BatchService { // 批量处理服务 public void batchInsert() { ... } public void batchUpdate() { ... } } ``` #### 五、多数据源特殊处理(引用[3]) 使用 `@DS` + `@Transactional` 时: 1. 级`@DS`定义默认数据源 2. 方法级`@DS`会覆盖级数据源 3. 多数据源事务需用 `@DSTransactional`[^3] --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值