Spring 事务隔离级别与传播特性

1. 原理

  A. Spring事务的本质就是数据库对事务的支持,没有数据库事务的支持,Spring是无法提供事务功能的;

  B. 纯JDBC操作步骤

    获取连接:Connection conn = DriverManager.getConnection();

    开启事务:conn.setAutoCommit(true/false);

    执行CRUD

    提交或回滚事务:conn.commit() / conn.rollback();

    关闭连接:conn.close();

  C. Spring自动完成开启事务或提交、回滚事务这两步,只需要在配置类加上开启@EnableTransactionManagement注解驱动,然后在相关类和方法上加上@Transactional注解;

  D. 真正的数据库层的事务提交和回滚是通过binlog和redolog实现的。

 

2.  Spring中的隔离级别

  A. default:这 PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别;

  B. read uncommitted:这是事务最低的隔离级别,它充许另外一个事务可以看到这个事务未提交的数据,这种隔离级别会产生脏读,不可重复读和幻读;

  C. read committed:保证一个事务修改的数据提交后才能被另外一个事务读取,另外一个事务不能读取该事务未提交的数据,这种隔离级别会产生不可重复读和幻读;

  D. repeatable read:这种事务隔离级别可以防止脏读,不可重复读,但是可能出现幻读;

  E. serializable:这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。

 

3. 事务的传播特性

  A. required:支持当前事务,如果当前没有事务,就新建一个事务,这是Spring默认的事务的传播;

  B. supports:支持当前事务,如果当前没有事务,就以非事务方式执行;

  C. mandatory:支持当前事务,如果当前没有事务,就抛出异常;

  D. requireds new:新建事务,如果当前存在事务,把当前事务挂起。新建的事务将和被挂起的事务没有任何关系,是两个独立的事务,外层事务失败回滚之后,不能回滚内层事务执行的结果,内层事务失败抛出异常,外层事务捕获,也可以不处理回滚操作;

  E. not supported:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起;

  F. never:以非事务方式执行,如果当前存在事务,则抛出异常;

  G. nested:如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务,则按REQUIRED属性执行。它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSourceTransactionManager事务管理器起效。

 

posted @ 2020-09-07 17:31  如幻行云  阅读(845)  评论(0编辑  收藏  举报