Spring事务管理
事务是一个重要的数据库控制手段,利用事务可以保证若干更新操作同时成功或失败,也可防止多个Session并发访问数据库所造成的数据不同步问题。
传统JDBC事务控制
事务控制的核心本质指的是对数据库中数据操作的完整性保证,利用事务的ACID原则可以保证在一次复杂的更新业务过程中,针对于数据库中的所有更新操作要么一起成功,要么一起失败。传统的关系型数据库最大的特征是支持事务,而这也导致传统关系型数据库的处理性能有限。
ACID原则:
- 原子性(Atomicity)一个事务的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会回滚(Rollback)到开始前的状态,就像没有执行过一样。
- 一致性(Consistency):一个事务可以封装状态改变(除非是只读的)。事务必须始终保持系统处于一致的状态,不管在给定时间内并发事务有多少。
- 隔离性(Isolation):隔离状态执行事务,使其好像是给定时间内系统执行的唯一操作。如果有两个事务运行在相同的时间内,执行着相同的功能,隔离性将确保每个事务都认为只有自己在使用系统。
- 持久性(Durability):事务完成后,该事务对数据库所进行的更改将持久保存在数据库中,不进行回滚。
JDBC提供了最原始的数据库操作标准。在java.sql.Connection接口中提供了完整的事务控制方法
由于传统JDBC在进行数据更新处理时采用的是立即执行模式,所以要先通过setAutoCommit (false)取消自动提交,而后才可以利用commit或rollback来实现更新数据的提交或回滚。
传统开发过程中,为了可以合理进行事务处理,往往需要在业务层中进行大量的编码处理,这就导致了开发与扩展的困难。在整个Spring里面充分考虑到事务控制的问题,所以将其与AOP的特征结合在一起,形成了新的事务处理机制,并且也提供了更加完善的事务处理架构。
Spring事务处理架构
Spring中为了让用户处理事务更加方便,专门设计了一套事务处理架构。这个架构可以有效地与AOP进行整合开发,通过AspectJ表达式来实现事务控制的切面定义。在Spring事务处理中,首先需要清楚地掌握几个重要的处理接口。
1.事务处理的核心标准接口org.springframework.transaction.PlatformTransactionManager。 此接口定义了事务控制的核心标准,在实际开发过程中可能有若干种数据库操作事务控制都会实现此接口,这样就可以被Spring进行统一管理,该接口的具体定义如下。
2.事务的定义
org.springframework.transaction.TransactionDefinition。 本接口中主要定义了事务的传播属性和隔离级别,同时确定了该事务是否只为只读事务以及超时时间配置。
3.事务状态
org.springframework.transaction.TransactionStatus。Spring里,一个业务操作可能会开启多个事务。要想标注出每个事务的具体状态,可通过TransactionStatus接口实例来描述。
事务传播属性
事务传播属性指的是不同层之间进行的事务控制处理,传播属性在TransactionDefinition接口中定义。
事务隔离级别
- 脏读
脏读是指一个事务正在访问数据并对数据进行了修改,当这种修改还没来得及提交到数据库中时,另一个事务也访问了这个数据,然后使用了这个数据。 - 不可重复读
不可重复读,是指一个事务需要多次读取同一数据,该事务还没结束时,另外一个事务也访问了该数据并进行了修改,那么,第一个事务两次读到的数据就有可能是不一样的。 - 幻读
幻读是事务非独立执行时发生的一种现象。第一个事务对一个表中的数据进行了修改,这种修改涉及表中的全部数据行。同时,第二个事务也对表中的数据进行了修改,这种修改是向表中插入一行新数据。那么,操作第一个事务的用户就会发现,表中竟然还有未修改的数据行,就像发生了幻觉一样。