Java基础之《@Transactional注解需注意事项》

@Transactional注解用于控制Java应用程序中的数据库事务。它默认提供REQUIRED传播级别、DEFAULT隔离级别、TIMEOUT_DEFAULT超时设置和false的只读属性。注解主要应用于public方法,非public方法虽能标注但不会触发事务。本类方法间的调用不会生效,因事务由代理类实现。只有查询方法通常不需要事务,而单一增删改操作需考虑异常处理和回滚需求。异常回滚需为RuntimeException或Error,或在注解中指定。多个事务独立执行,除非配置为参与同一事务。

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

@Transactional注解默认值
String value() default "";
Propagation propagation() default Propagation.REQUIRED;
Isolation isolation() default Isolation.DEFAULT;
int timeout() default TransactionDefinition.TIMEOUT_DEFAULT;
boolean readOnly() default false;

只读事务是否做无用功?
https://blog.youkuaiyun.com/yulin_ganbo/article/details/78566835

注意事项:
1、@Transactional只能被应用到public方法上,对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没有事务功能
2、如果是本类加了事务的方法,调用本类另一个加了@Transactional标签的方法,事务也不会生效,因为切面是由代理类实现,代理类调用本类方法,是用this.xxx切面切不进去
3、哪些地方需要加事务:
只有查询的方法可以不加事务
只有一句增删改sql的方法,考虑数据库操作后面会不会抛异常,抛异常了要不要回滚
4、要想事务回滚你的异常要么派生自RuntimeException或者Error,或者在注解中用rollbackFor指定

事务的使用
1、A方法上加了@Transactional注解
//没有事务
A();
//没有事务
如果A方法前后都没有事务,那么A方法调用完后,事务就会提交
2、A、B方法上加了@Transactional注解
//没有事务
A();
B();
//没有事务
A方法执行完,事务提交。B方法执行完,事务提交。A和B是各自独立的事务。
3、A、B方法上加了@Transactional注解
//没有事务
A() {
  B();
}
//没有事务
A方法调用B方法,B方法可以加入A方法开启的事务,或者单独新建一个事务(根据事务传递性配置)
4、在一个事务中,要操作多张表时,需要考虑一张表操作成功,另一张表操作失败的情况
如果在外层捕获了异常,事务不会回滚,那么就会造成,一张表有记录,一张表没记录的情况
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值