事务的ACID
- Atomicity原子性:事务是一个原子操作,由一些列动作组成,事务的原子性确保动作要么全部完成,要么都不完成。
- Consistency一致性:一旦事务完成,系统必须确保它锁建模的业务处于一致的状态,而不是部分完成或部分失败。
- Isolation隔离性:可能有许多事务会同时处理相同的数据,因此每个事务都应该与其它事务隔离开来,防止数据破坏。
- Durability持久性:一旦事务完成,无论系统发生什么故障,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来,通常情况下,事务的结果会被持久化到存储器中。
Spring事务的核心接口
Spring并不直接管理事务,而是提供多种事务管理器,它将事务管理委托给持久化框架。
事务的属性
事务的属性是:传播行为,隔离规则,回滚规则,是否只读,事务超时。
事务的传播行为
当一个事务方法调用另一个事务方法的时候,必须指定事务应该如何传播。
Spring定义了七种传播行为:
- PROPAGATION_REQUIRED:表示当前方法必须运行在事务中,如果当前事务存在,方法将会在该事务中运行。否则,会启动一个新的事务。
- PROPAGATION_SUPPORTS:表示当前方法不需要事务上下文,但是如果存在当前事务的话,那么该方法会在这个事务中运行。
- PROPAGATION_MANDATORY:表示该方法必须在事务中运行,如果当前事务不存在的话,则会抛出一个异常。
- PROPAGATION_REQUIRED_NEW:表示当前方法必须运行在它自己的事务中。一个新事务将被启动。如果存在当前事务,那么该方法执行期间,当前事务会被挂起。
- PROPAGATION_NOT_SUPPORTED:表示该方法不应该运行在事务中,如果存在当前事务,在该方法运行期间,当前事务将被挂起。
- PROPAGATION_NEVER:当前方法不应该运行在事务上下文环节中。如果当前正有一个事务在运行,则会抛出异常。
- PROPAGATION_NESTED:表示当前已经存在一个事务,那么该方法将会在嵌套事务中运行。嵌套的事务可以独立于当前事务进行单独地提交或回滚。
Spring的隔离级别
- DEFAULT:默认的隔离级别,使用数据库默认的事务隔离级别。
- 未提交读:允许读取未提交的读,可能导致脏读,不可重复读,幻读。
- 已提交读:允许读取已提交读,可能导致不可重复读,幻读。
- 可重复读:不能更新另一个事务修改但未提交的数据,可能引起幻读。
- 串行化:序列执行效率低。
v1.5.2