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

概述

  • @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),如果类加了这个注解,那么这个类里面的方法抛出异常,就会回滚,数据库里面的数据也会回滚