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事务管理器起效。