1、spring 事物管理 2010-05-13 10:49 172 人阅读 评论(0) 收藏 举报 Spring 的事务管理是其非常重要的一个方面,Spring 的应用主要集中在Ioc/AOP/DAO/事务四个方面。这部分内容比较抽象,需要花费大篇幅来写。一、事务控制的基本知识不管是什么事务,必须先对数据库的事务概念有个明确认识才行。首先先简单介绍下数据库的事务。事务的概念:事务是一组原子性操作的工作单元,这组工作单元要么执行成功,要么不成功。事务有四个属性-原子性、一致性、独立性和持久性(CAID ),所有这些方面都是依靠事务资源去维护。事务隔离:SQL 标准用三个必须在并行的事务之间避免的现
2、象定义了四个级别的事务隔离。 这些不希望发生的现象是:脏读(dirty reads)一个事务读取了另一个未提交的并行事务写的数据。不可重复读(non-repeatable reads)一个事务重新读取前面读取过的数据, 发现该数据已经被另一个已提交的事务修改过。幻读(phantom read)一个事务重新执行一个查询,返回一套符合查询条件的行, 发现这些行因为其他最近提交的事务而发生了改变。这四种隔离级别和对应的行为如下表:隔离级别 脏读(Dirty Read) 不可重复读(NonRepeatable Read) 幻读(Phantom Read)读未提交(Read uncommitted) 可
3、能 可能 可能读已提交(Read committed) 不可能 可能 可能可重复读(Repeatable read) 不可能 不可能 可能可串行化(Serializable ) 不可能 不可能 不可能Spring 事务包中的 TransactionDefinition 接口有对应的隔离级别的定义。高清楚以上的概念,才能更好理解 Spring 的事务管理。二、从编程的角度认识事务和数据库事务概念几乎完全一样:事务是一种机制,把组成的多个操作视为一个操作单元进行处理,这个单元要么全部执行成功,要么全部不执行。在事务中,涉及的操作可能依赖于很多不同的数据库和服务器。从程序角度考虑,事务可以分为两大类
4、:一种是本地事务,一种是全局事务(也叫分布式事务)。本地事务:是针对某个独立的事务资源(如 JDBC)操作的事务。全局事务:是协同或横跨多个资源(如 JDBC 连接、数据库等)操作的事务(上下文),多个资源协作是由事务管理器来完成的。事务源:是可以绑定事务操作的资源。事务的概念最初来自数据库的操作,事务的资源也仅限于数据库。但编程中的事务,事务源很广泛,不但可以包含数据库,还可以包含打印机等。本地事务和全局事务有很大的区别:全局事务的控制非常复杂,全局事务使用两阶段提交协议(2PC)来提交资源源的变化。阶段一请求所有资源准备实现改变;阶段二请求做实际的改变。全局事务 ID(XID)是用于跟踪所
5、有分布式事务相关的改变。全局事务的实现需要由专门的应用服务器或者容器去实现。在 Java 中,可以借助实现了 Java Transaction API 的库来进行全局事务控制。JDBC 与 JTAJDBC 是 Java database connectivity 的缩写,意思是 Java 数据库连接。一般本地事务是与一个数据库连接相关的,因此 Java 中常称本地事务为 JDBC 事务。JDBC 本身提供了简单的本地事务控制,可以满足针对一个 JDBC 连接事务的需求。JTA 是 Java Transaction API 的缩写,意思是 Java 事务 API,这是一种组复杂事务控制接口,这组
6、接口作为 J2EE 规范暴露给容器开发商,一般都由 J2EE容器来实现。Spring 很牛,也实现了这组 API,使得任何应用使用 JTA 事务变得更容易。三、认识 Spring 的事务包的 APISpring 对事务的控制的 API 全部位于 org.springframework.transaction 包下面,其中出去异常定义的类外,仅有四个接口,这四个接口是 Spring 操作事务的核心,下面一一介绍:org.springframework.transactionInterfacesPlatformTransactionManagerSavepointManagerTransactio
7、nDefinitionTransactionStatusExceptionsCannotCreateTransactionExceptionHeuristicCompletionExceptionIllegalTransactionStateExceptionInvalidIsolationLevelExceptionInvalidTimeoutExceptionNestedTransactionNotSupportedExceptionNoTransactionExceptionTransactionExceptionTransactionSuspensionNotSupportedExce
8、ptionTransactionSystemExceptionTransactionTimedOutExceptionTransactionUsageExceptionUnexpectedRollbackException要搞明白 Spring 事务控制的原理,必须理解上面四个接口的含义,下面一一介绍之。1、PlatformTransactionManager是一个事务管理平台,该接口有许多具体的事务实现类,例如DataSourceTransactionManager, HibernateTransactionManager, JdoTransactionManager, JmsTransac
9、tionManager, JpaTransactionManager, JtaTransactionManager, TopLinkTransactionManager, WebLogicJtaTransactionManager 等等,通过实现此接口,Spring 可以管理任何实现了这些接口的事务。开发人员也可以使用统一的编程模型来控制管理事务。此接口中有三个方法:void commit(TransactionStatus status)Commit the given transaction, with regard to its status.监视事务状态,并提交一个事务。Transac
10、tionStatus getTransaction(TransactionDefinition definition)Return a currently active transaction or create a new one, according to the specified propagation behavior.根据事务的隔离级别和传播行为,返回当前活动的事务或者产生一个新的事务。void rollback(TransactionStatus status)Roll back the given transaction.回滚给定的事务。2、SavepointManager事务
11、回滚点管理接口,提供创建、释放回滚点,或者回滚到指定的回滚点。方法摘要:Object createSavepoint()Create a new savepoint.创建一个新的回滚点。void releaseSavepoint(Object savepoint)Explicitly release the given savepoint.释放一个给定的回滚点。void rollbackToSavepoint(Object savepoint)Roll back to the given savepoint.回滚到给定的回滚点。3、TransactionDefinition这个接口的作用就是定
12、义事务的名称、隔离级别、传播行为、超时时间长短、只读属性等。字段摘要:(因为是接口,里面都是 int 常量,即 public static final 类型的,很多,我就只写常量的名字和含义)这些接口分两组,分别是事务隔离级别和事务传播行为。/事务隔离级别(数据库级别的知识)TransactionDefinition.ISOLATION_DEFAULT使用底层数据库默认隔离级别。TransactionDefinition.ISOLATION_READ_UNCOMMITTED 读未提交最低隔离等级,允许事务读取其他并行的事务还没有提交的数据,会发生脏读(dirty reads)、不可重复读(no
13、n-repeatable reads)、幻读(phantom read)等问题。TransactionDefinition.ISOLATION_READ_COMMITTED 读已提交允许事务读取其他并行的事务已经提交的数据,可以防止脏读问题。TransactionDefinition.ISOLATION_REPEATABLE_READ 可重复读保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。TransactionDefinition.ISOLATION_SERIALIZABLE 可串行化所有事务都严格隔离,各个事务顺序执行。很容易发生死锁。/事务传播行为Transaction
14、Definition.PROPAGATION_REQUIRED支持现有的事务,如果没有则新建一个事务。TransactionDefinition.PROPAGATION_SUPPORTS支持现有的事务,如果没有则以非事务状态运行。TransactionDefinition.PROPAGATION_MANDATORY支持现有事务,如果没有则抛出异常。TransactionDefinition.PROPAGATION_REQUIRES_NEW总是发起一个新事务。如果当前已存在一个事务,则将其挂起。TransactionDefinition.PROPAGATION_NOT_SUPPORTED不支持事
15、务,总是以非事务状态运行,如果当前存在一个事务,则将其挂起。TransactionDefinition.PROPAGATION_NEVER不支持事务,总是以非事务状态运行,如果当前存在一个事务,则抛出异常。TransactionDefinition.PROPAGATION_NESTED如果石阡已经存在一个事务,则以嵌套事务的方式运行,如果当前没有事务,则创建一个新事务。方法摘要:int getIsolationLevel()Return the isolation level.返回事务的隔离级别。String getName()Return the name of this transacti
16、on.返回事务的名字。int getPropagationBehavior()Return the propagation behavior.返回事务的是传播行为。int getTimeout()Return the transaction timeout.返回事务的超时时间。boolean isReadOnly()Return whether to optimize as read-only transaction.返回是否(优化为)只读属性。4、TransactionStatus这个接口的作用就是获取事务的状态(回滚点、是否完成、是否新事物、是否回滚)属性,还可以进行事务 rollback
17、-only 的设置。方法摘要:boolean hasSavepoint()Return whether this transaction internally carries a savepoint, i.e. has been created as nested transaction based on a savepoint.判断这个事务是否有一个内在的回滚点(savepoint),即创建为基于回滚点的嵌套事务。boolean isCompleted()Return whether this transaction is completed, that is, has already be
18、en committed or rolled back.判断这个事务是否完成,也就是已经提交或者回滚。boolean isNewTransaction()Return if the transaction is new, else participating in an existing transaction.判断一个事物是否为新事务,或者是这个事务参与到一个已经存在的事务里面。boolean isRollbackOnly()Return if the transaction has been set rollback-only.判断这个事务是否已经设置了 rollback-only。void setRollbackOnly()Set the transaction rollback-only.设置这个事务 rollback-only。