Spring注解之@Transactional对于事务异常的处理

本文详细解析了@Transactional注解的使用及其实现原理,包括其在接口实现类或方法上的正确添加方式,以及AOP机制下代理connection对象的创建与事务回滚过程。同时,探讨了Spring对不同异常类型的事务处理策略,以及如何通过自定义注解参数改变这些默认行为。

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

概述

  • @Transactional 是声明式事务管理编程中使用的注解

  • 添加位置:接口实现类或接口实现方法上,而不是接口类中

  • 访问权限:public 的方法才起作用

  • @Transactional实现原理:

    1)事务开始时,通过AOP机制,生成一个代理connection对象,并将其放入DataSource实例的某个与DataSourceTransactionManager相关的某处容器中。在接下来的整个事务中,客户代码都应该使用该connection连接数据库,执行所有数据库命令[不使用该connection连接数据库执行的数据库命令,在本事务回滚的时候得不到回滚](物理连接connection逻辑上新建一个会话session;DataSource与TransactionManager配置相同的数据源)

    2)事务结束时,回滚在第1步骤中得到的代理connection对象上执行的数据库命令,然后关闭该代理connection对象(事务结束后,回滚操作不会对已执行完毕的SQL操作命令起作用)

  • spring对于事务异常的处理

   unchecked   运行期Exception   spring默认会进行事务回滚       比如:RuntimeException

   checked       用户Exception       spring默认不会进行事务回滚   比如:Exception

     如何改变spring的这种默认事务行为?可以通过在方法上

     添加@Transactional(noRollbackFor=RuntimeException.class)让spring对于RuntimeException不回滚事务

     添加@Transactional(RollbackFor=Exception.class)让spring对于Exception进行事务的回滚

     在项目中,@Transactional(rollbackFor=Exception.class),如果类加了这个注解,那么这个类里面的方法抛出异常,就会回滚,数据库里面的数据也会回滚

转载于:https://www.cnblogs.com/maxytj/p/10264015.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值