在项目中,事务可以有效的防止在程序出错时,对于数据的错误修改,回滚到修改之前。
spring事务和数据库事务一样,都有四个特性(ACID):
原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。
一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。
隔离性(Isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。
持久性(Durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中。
事务的传播性
官方文档解释(https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/transaction/annotation/Propagation.html)
MANDATORY:支持当前事务,如果不存在则抛出异常。
NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。
NEVER:如果事务存在,则以非事务方式执行,抛出异常。
NOT_SUPPORTED:支持当前事务,如果不存在则创建新事务。
REQUIRED:支持当前事务,如果不存在则创建新事务。
REQUIRES_NEW:创建一个新事务,并暂停当前事务(如果存在)。
SUPPORTS:支持当前事务,如果不存在则以非事务方式执行。
事务的隔离性
Isolation是事务自带事务隔离级别, 隔离级别是指若干个并发的事务之间的隔离程度.
官方文档解释(https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/transaction/annotation/Isolation.html)
DEFAULT:使用基础数据存储的默认隔离级别。
READ_COMMITTED: 该隔离级别表示一个事务只能读取另一个事务已经提交的数据。可以发生不可重复的读取和幻像读取。
READ_UNCOMMITTED:该隔离级别表示一个事务可以读取另一个事务修改但还没有提交的数据。一个常量,表示可以发生脏读,不可重复读和幻像读。
REPEATABLE_READ:该隔离级别表示一个事务在整个过程中可以多次重复执行某个查询,并且每次返回的记录都相同。一个常量,表示防止脏读和不可重复读; 可以发生幻像读取。
SERIALIZABLE:所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
spring支持编程式事务管理和声明式事务管理两种方式。
编程时事务管理
编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。
声明式事务管理
声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
一种是基于tx和aop名字空间的xml配置文件,另一种就是基于@Transactional注解。显然基于注解的方式更简单易用,更清爽。
领取专属 10元无门槛券
私享最新 技术干货