@Transactional的属性与使用

@Transactional注解用于控制事务边界,它可以作用于接口、类或方法上。该注解提供了多种属性来定制事务行为,如传播行为、隔离级别等,并且可以通过指定特定异常来控制回滚或不回滚。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@Transactional属性 

属性 类型 描述
value String 可选的限定描述符,指定使用的事务管理器
propagation enum: Propagation 可选的事务传播行为设置
isolation enum: Isolation 可选的事务隔离级别设置
readOnly boolean 读写或只读事务,默认读写
timeout int (in seconds granularity) 事务超时时间设置
rollbackFor Class对象数组,必须继承自Throwable 导致事务回滚的异常类数组
rollbackForClassName 类名数组,必须继承自Throwable 导致事务回滚的异常类名字数组
noRollbackFor Class对象数组,必须继承自Throwable 不会导致事务回滚的异常类数组
noRollbackForClassName 类名数组,必须继承自Throwable 不会导致事务回滚的异常类名字数组

用法

       @Transactional 可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。

         虽然 @Transactional 注解可以作用于接口、接口方法、类以及类方法上,但是 Spring 建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理时它才会生效。另外, @Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。如果你在 protected、private 或者默认可见性的方法上使用 @Transactional 注解,这将被忽略,也不会抛出任何异常。

        默认情况下,只有来自外部的方法调用才会被AOP代理捕获,也就是,类内部方法调用本类内部的其他方法并不会引起事务行为,即使被调用方法使用@Transactional注解进行修饰。



### 关于 `@Transactional` 属性功能使用说明 #### 一、基本概念 `@Transactional` 是 Spring 提供的一个用于管理声明式事务的强大注解。通过此注解可以简化 Java 应用程序中的数据库操作,无需编写繁琐的 JDBC 或 JPA 代码来手动控制事务边界。 当应用了该注解的方法执行期间发生未处理的运行时异常(即继承自 `RuntimeException` 的异常),则会触发自动回滚机制;而对于受检异常,默认情况下不会引发回滚行为,除非显式指定了相应的策略[^1]。 #### 二、主要属性介绍 - **propagation**: 定义传播行为,决定了当前方法如何参现有事务或创建新事务。常见的取值有: - REQUIRED:如果存在活动事务,则加入其中;如果没有,则启动新的独立事务。 - REQUIRES_NEW:总是开启一个新的事务,在这个过程中暂停任何已存在的事务。 - **isolation**: 设置隔离级别,影响并发读写同一资源时的行为模式。例如 READ_COMMITTED 可防止脏读现象的发生。 - **timeout**: 指定超时期限(秒)。一旦超过设定时间仍未完成任务,将会抛出 TransactionTimedOutException 并且回滚整个流程。 - **readOnly**: 声明是否只读访问数据库,默认为 false 。对于查询密集型场景下可提高性能表现。 - **rollbackFor/ noRollbackFor**: 明确指出哪些特定类型的异常应该引起回滚动作或是忽略它们继续提交更改。这有助于更精确地掌控错误处理逻辑而不必依赖默认规则。 ```java @Service public class EmployeeService { @Transactional( propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED, timeout = 30, readOnly = false, rollbackFor = Exception.class ) public void saveEmployee(Employee employee){ // Save logic here... } } ``` 为了使 `@Transactional` 正常工作,还需要确保项目配置文件中启用了事务管理支持,比如添加如下所示的注解到应用程序入口类: ```java @Configuration @EnableTransactionManagement @ComponentScan(basePackages = "com.example.service") public class AppConfig { } ``` 此外需要注意的是,由于 AOP 实现基于代理的方式运作,因此直接在同一个 Bean 内部调用带有 `@Transactional` 标记的方法可能无法按预期激活事务上下文环境[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值