Spring 事务

事务的实现方式有两种 : 

1 . 编程式事务 , 通过代码的方式手动实现事务 .

2 . 声明式事务 , 通过注解的方式实现声明式事务 .

编程式事务三步骤 : 获取事务 , 提交事务 , 回滚事务 .

@ResponseBody
@RestController
public class UserController {
    // 事务管理器 (通过事务管理器拿到事务)
    @Autowired
    private DataSourceTransactionManager transactionManager;
    // 事务定义对象 (可以进行事务属性的设置)
    @Autowired
    private TransactionDefinition transactionDefinition;

    public void met() {
        // 开启事务
        TransactionStatus transactionStatus = transactionManager.getTransaction(transactionDefinition);

        // 方法的操作......

        // 回滚事务
        transactionManager.rollback(transactionStatus);
        // 提交事务
//        transactionStatus.commit(transactionStatus);
    }
}

声明式事务 

声明式事务的实现很简单 , 只需要在方法或者类上添加 @Transactional 注解就可以了 ,进入方法时自动开启事务 , 方法执行完全自动提交事务 , 如果中途发生了异常会自动回滚事务.

@Transactional 修饰方法时 只能应用到 public 方法上 , 否则不会生效.

                            修饰类时 , 表明该注解对该类中的所有的 public 方法都生效.

Spring 事务_第1张图片

    @Transactional // 声明式事务 (自动提交)
    @RequestMapping("/met1")
    public void met1() {
        // 方法的操作
    }

注意 : 

    @Transactional // 声明式事务 (自动提交)
    @RequestMapping("/met1")
    public void met1() {
        try {
            int num = 10 / 0;
        }catch (NullPointerException e) {
            System.out.println(e.getMessage());
        }
    }

上述方法不会回滚 , 原因是 报错被 try catch 语句 处理了.

解决方法 :

1 . 将异常重新抛出 throw e

Spring 事务_第2张图片

2 . 手动回滚事务Spring 事务_第3张图片

Spring 事务隔离级别

1 . Isolation.DEFAULT:以连接的数据库的事务隔离级别为主。
2 . Isolation.READ UNCOMMITTED:读未提交,可以读取到未提交的事务,存在脏读。

3 . Isolation.READ_COMMITTED:读已提交,只能读取到已经提交的事务,解决了脏读,存在不可重复读。
4.Isolation.REPEATABLE_READ:可重复读,解决了不可重复读,但存在幻读(MySQL默认级
别)。

5 . Isolation.SERIALIZABLE:串行化,可以解决所有并发问题,但性能太低。

Spring 事务传播机制

Spring 事务传播机制定义了当多个包含事务的方法 , 相互调用时 , 事务是如何咋这些方法间进行传递的 .

解决了如下问题 : 当多个方法(带有事务)相互调用时 , 多个事务是如何规定使用的 .

Spring 事务_第4张图片

Spring 事务传播机制的分类 :

1 . Propagation.REQUIRED 默认传播机制 , 如果调用链存在事务 , 则加入事务 , 如果不存在则创建事务 .

2 . Propagation.SUPPORTS 如果调用链存在事务 , 则加入事务 ; 如果不存在则非事务方式运行 .

3 . Propagation.MANDATORY 如果当前存在事务 , 则加入该事务 , 如果当前没有事务 , 则抛出异常 .

4 . Propagation.REQUIRES_NEW 表示创建一个新的事务 , 如果当前存在事务 , 则把当前事务挂起 . (也就是各玩各的)

5 . Propagation.NOT_SUPPORTD : 以非事务方式运行 , 如果当前存在事务 , 则把当前事务挂起 .

6 . Propagation.NEVER : 以非事务方式运行 , 如果当前存在事务 , 则抛出异常 .

7 . Propagation.NESTED : 如果当前存在事务 , 则创建一个事务作为当前事务的嵌套事务来运行 ; 如果当前没有事务 , 则该取值等价于 PROPAGATION_REQUIRED .

End.....Spring 事务_第5张图片

你可能感兴趣的:(java,数据库,mysql)