Spring 事务

94 阅读2分钟

事务的特性

事务有ACID四个特点

1. A:代表原子性,比如说两个操作要么都成功要么都失败

2. C:代表一致性,比如说转账前后我都是200块,不管怎么操作都是200块。

3. I:代表隔离性,多个事务之前不能互相影响,做到隔离。

4. D:代表持久化,事务操作的结果,要永久保存到数据库中。

spring 创建事务的方式

1.  编程式事务

在 spring 中为了支持编程式事务,专门提供了一个类:TransactionTemplate,在它的 execute 方法中,就实现了事务的功能

优势:粒度小

 @Autowired
   private TransactionTemplate transactionTemplate;
   ...
   public void save(final User user) {
         queryData1();
         queryData2();
         transactionTemplate.execute((status) => {
            addData1();
            updateData2();
            return Boolean.TRUE;
         })
   }

2.  声明式事务

基于@Transactional注解实现

优势:无代码入侵

spring的传播属性

事务传播机制外部有事务外部无事务对事务的需求性
required加入外部事务开启
required_now挂起外部事务,自己开启事务开启
support加入外部事务不开启
not_support挂起外部事务不开启
never异常不开启
mandtory加入外部事务异常
nested嵌套事务开启

● required:当前的业务方法,如果外部不存在事务,就开启一个事务;如果外部存在事务,则加入该事务

● required_new:当前的事务方法,如果外部不存在事务,则开启一个事务;如果外部存在事务,则将该外部事务挂起,另外开启一个新的事务,执行该事务之后再将外部事务还原;

● supports:当前业务方法,如果外部不存在事务,则不开启事务;如果外部存在事务,则加入外部事务

● not_supported;当前业务方法,如果外部不存在事务,则不开启事务;如果外部存在事务,则直接挂起外部事务

● never:当前业务方法,外部一定不能存在事务,否则直接抛出异常

● mandator:当前业务方法外部必须存在事务,否则直接抛出异常

● nested:内嵌事务,在当前的事务中可以设置一个或多个保存点,可以进行回滚到指定的保存点

spring 事务失效的场景

1.  权限访问问题(使用非public 的权限)

2.  使用final 修饰的方法

3.  调用本类的方法(this)

4.  该对象未被spring 管理

5.  多线程调用

6.  手动 try...catch 了异常

7.  发生另类的异常(默认情况下只会回滚RuntimeException和Error)

8.  数据库引擎不支持事务