Spring如何管理事务以及隔离级别
(1)问题分析:
主要考察事务的4种隔离级别,如何使用spring进行事务管理及声明式事务管理
(2)核心问题讲解:
数据隔离级别分为不同的四种:
如果不考虑事务的隔离性,引发一些安全性问题:
1) 脏读: 一个事务读到另一个事务还没有提交的数据。
不可重复读: 一个事务读到了另一个事务已经提交的update的数据,导致在当前的事务中多次查询结果不一致。
2) 虚读/幻读: 一个事务读到另一个事务已经提交的insert的数据,导致在当前的事务中多次的查询结果不一致。
3) read uncommitted:未提交读。脏读,不可重复读,虚读都可能发生。
4) read committed:已提交读.避免脏读.但是不可重复读和虚读有可能发生。
5) repeatable read:可重复读.避免脏读,不可重复读.但是虚读有可能发生。
6) serializable:串行化的.避免脏读,不可重复读,虚读的发生。
级别超高,越安全,效率越低。
Spring的事务机制包括声明式事务和编程式事务:
1) 编程式事务管理:Spring推荐使用TransactionTemplate,实际开发中使用声明式事务较多。
2) 声明式事务管理:将我们从复杂的事务处理中解脱出来,获取连接,关闭连接、事务提交、回滚、异常处理等这些操作都不用我们处理了,Spring都会帮我们处理。
3) 声明式事务管理使用了AOP面向切面编程实现的,本质就是在目标方法执行前后进行拦截。在目标方法执行前加入或创建一个事务,在执行方法执行后,根据实际情况选择提交或是回滚事务。
(3)问题扩展
Spring的事务管理器
Spring并不直接管理事务,而是提供了多种事务管理器,它们将事务管理的职责委托给JTA或其他持久化机制所提供的平台相关的事务实现。每个事务管理器都会充当某一特定平台的事务实现的门面,这使得用户在Spring中使用事务时,几乎不用关注实际的事务实现是什么。
Spring事务的只读
“只读事务”并不是一个强制选项,它只是一个“暗示”,提示数据库驱动程序和数据库系统,这个事务并不包含更改数据的操作,那么JDBC驱动程序和数据库就有可能根据这种情况对该事务进行一些特定的优化,比方说不安排相应的数据库锁,以减轻事务对数据库的压力,毕竟事务也是要消耗数据库的资源的。“只读事务”仅仅是一个性能优化的推荐配置而已,并非强制你要这样做不可。
Spring事务的事务超时
为了使应用程序更好的运行,事务不能运行太长的时间。因此,声明式事务的第四个特性就是超时。
Spring事务的回滚规则
默认情况下,事务只有在遇到运行期异常时才会回滚,而在遇到检查型异常时不会回滚,但是也可以声明事务在遇到特定的检查型异常时像遇到运行期异常那样回滚。同样,你还可以声明事务遇到特定的异常不回滚,即使这些异常是运行期异常。
(4)结合项目中使用
如何管理的:
1)Spring事务管理主要包括3个接口,Spring的事务主要是由他们三个共同完成的。
PlatformTransactionManager:事务管理器--主要用于平台相关事务的管理主要有三个方法:
commit 事务提交;
rollback 事务回滚;
2)getTransaction 获取事务状态。
● TransactionDefinition:事务定义信息--用来定义事务相关的属性,给事务管理器
● PlatformTransactionManager使用,这个接口有下面四个主要方法:
● getIsolationLevel:获取隔离级别;
● getPropagationBehavior:获取传播行为;
● getTimeout:获取超时时间;
● isReadOnly:是否只读(保存、更新、删除时属性变为false--可读写,查询时为true--只读)
事务管理器能够根据这个返回值进行优化,这些事务的配置信息,都可以通过配置文件进行配置。
3)TransactionStatus:事务具体运行状态--事务管理过程中,每个时间点事务的状态信息。
例如它的几个方法:
● hasSavepoint():返回这个事务内部是否包含一个保存点,
● isCompleted():返回该事务是否已完成,也就是说,是否已经提交或回滚
● isNewTransaction():判断当前事务是否是一个新事务