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