@Transactional 注解使用的注意事项

事务管理

事务管理在系统开发中是不可缺少的一部分,Spring提供了很好的事务管理机制,主要分为编程式事务和声明式事务两种。

编程式事务: 是指在代码中手动的管理事务的提交、回滚等操作,代码侵入比较强。

声明式事务: 基于AOP面向切面的,它将具体业务与事务处理部分解耦,代码侵入性很低,所以在实际开发中声明式事务比较多。声明式事务有两种实现方式,分别式基于TX和AOP的xml配置文件方式,第二种就是基于 @Transactional注解。

可以用在哪些地方?

@Transactional可以用在接口、类、类方法

  • 作用于:当把@Transactional注解放在类上时,表示所有该类的 public 方法都配置相同的事务属性信息。

  • 作用于方法:当类配置了@Transactional,方法也配置了@Transactional,方法的事务会覆盖类的事务配置信息。

  • 作用于接口:不推荐这种使用方法,因为一旦标注在 Interface 上并配置了 Spring AOP 使用 CGLib 动态代理,将会导致 @Transactional 注解失效。

@Transactional 注解参数说明

参数功能
readOnly该属性用于设置当前事务是否为只读事务,设置为true表示只读,false表示可读写,默认为false。例如:@Transactional(readOnly=true)
rollbackFor该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常时,则进行事务回滚。例如:指定单一异常类:@Transactional(rollbackFor=RuntimeException.class),也可以指定多个异常类,默认是:RuntimeException和Error
rollbackForClassName该属性用于设置需要进行回滚的异常类名称数组,当方法抛出指定异常名称的异常时,则进行事务回滚。例如:指定单一异常类名称@Transactional(rollbackForClassName=“RuntimeException”)指定多个:@Transactional(rollbackForClassName={“RuntimeException”,“Exception”})
noRollbackFor该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚。例如:指定单一异常类 @Transactional(noRollbackFor=RuntimeException.class) 指定多个:@Transactional(noRollbackFor={RuntimeException.class, Exception.class})
noRollbackForClassName该属性用于设置不需要进行回滚的异常类名称数组。
propagation该属性用于设置事务的传播行为,例如:@Transactional(propagation=Propagation.NOT_SUPPORTED)
timeout该属性用于设置事务的超时秒数,默认值为-1表示永不超时
isolation该属性用于设置底层数据库的事务隔离级别,事务隔离界别用于处理多事务并发情况,通常使用数据库默认的隔离级别即可。

注意事项以及失效情况

  • @Transactional 应用在非 public 修饰的方法上

  • @Transactional 注解属性 propagation 设置错误,配置以下三种 propagation,事务将不会发生回滚。

    • PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。

    • PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。

    • PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。

  • @Transactional 注解属性 rollbackFor 设置错误

  • 同一个类中方法调用,导致@Transactional失效

  • 异常被catch吞掉导致失效

  • 数据库引擎不支持事务

 

  • 26
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值