`

spring 事务(常规)

 
阅读更多

1 本地事务,全局事务

   本地事务:在单个 EIS 或数据库的本地并且限制在单个进程内的事务。本地事务不涉及多个数据来源

   全局事务:资源管理器管理和协调的事务,可以跨越多个数据库和进程。资源管理器一般使用 XA 二阶段提交协议与“企业信息系统”(EIS) 或数据库进行交互

2 spring事务api

   PlatformTransactionManager, TransactionDefinition, SavepointManager, TransactionStatus

 

   (1) PlatformTransactionManager:事务管理平台,一个策略接口,不同的持久层框架使用不同的实现类来处理事务,例如:DataSourceTransactionManager, HibernateTransactionManager, JdoTransactionManager, JmsTransactionManager, JpaTransactionManager, JtaTransactionManager, TopLinkTransactionManager, WebLogicJtaTransactionManager,通过实现此接口,Spring可以管理任何实现了这些接口的事务,

此接口方法:

TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException; 根据事务的隔离级别和传播行为,返回当前活动的事务或者产生一个新的事务

void commit(TransactionStatus status) throws TransactionException;监视事务状态,并提交一个事务

void rollback(TransactionStatus status) throws TransactionException;回滚给定的事务

 

    (2) TransactionDefinition: 这个接口的作用就是定义事务的名称、隔离级别、传播行为、超时时间长短、只读属性等

主要方法:

 int getIsolationLevel()
          返回事务的隔离级别。
 String getName()
          返回事务的名字。
 int getPropagationBehavior()
          返回事务的是传播行为。
 int getTimeout()
          返回事务的超时时间。
 boolean isReadOnly()
          返回是否(优化为)只读属性。

    (3)SavepointManager:事务回滚点管理接口,提供创建、释放回滚点,或者回滚到指定的回滚点
 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.
          回滚到给定的回滚点。
    (4) TransactionStatus 这个接口的作用就是获取事务的状态(回滚点、是否完成、是否新事物、是否回滚)属性,还可以进行事务rollback-only的设置
 boolean hasSavepoint()
          判断这个事务是否有一个内在的回滚点(savepoint),即创建为基于回滚点的嵌套事务。
 boolean isCompleted()
          判断这个事务是否完成,也就是已经提交或者回滚。
 boolean isNewTransaction()
          判断一个事物是否为新事务,或者是这个事务参与到一个已经存在的事务里面。
 boolean isRollbackOnly()
          判断这个事务是否已经设置了rollback-only。
 void setRollbackOnly()
          设置这个事务rollback-only。
3 spring 事务传播特性
 Required:必须有逻辑事务,否则新建一个事务,使用PROPAGATION_REQUIRED指定,表示如果当前存在一个逻辑事务,则加入该逻辑事务,否则将新建一个逻辑事务
 RequiresNew:创建新的逻辑事务,使用PROPAGATION_REQUIRES_NEW指定,表示每次都创建新的逻辑事务(物理事务也是不同的)
 Supports:支持当前事务,使用PROPAGATION_SUPPORTS指定,指如果当前存在逻辑事务,就加入到该逻辑事务,如果当前没有逻辑事务,就以非事务方式执行
 NotSupported:不支持事务,如果当前存在事务则暂停该事务,使用PROPAGATION_NOT_SUPPORTED指定,即以非事务方式执行,如果当前存在逻辑事务,就把当前事务暂停,以非事务方式执行
 Mandatory:必须有事务,否则抛出异常,使用PROPAGATION_MANDATORY指定,使用当前事务执行,如果当前没有事务,则抛出异常(IllegalTransactionStateException)

 Never:不支持事务,如果当前存在是事务则抛出异常,使用PROPAGATION_NEVER指定,即以非事务方式执行,如果当前存在事务,则抛出异常(IllegalTransactionStateException)

 

 Nested:嵌套事务支持,使用PROPAGATION_NESTED指定,如果当前存在事务,则在嵌套事务内执行,如果当前不存在事务,则创建一个新的事务,嵌套事务使用数据库中的保存点来实现,即嵌套事务回滚不影响外部事务,但外部事务回滚将导致嵌套事务回滚

 

Nested和RequiresNew的区别:

1、  RequiresNew每次都创建新的独立的物理事务,而Nested只有一个物理事务;

2、  Nested嵌套事务回滚或提交不会导致外部事务回滚或提交,但外部事务回滚将导致嵌套事务回滚,而 RequiresNew由于都是全新的事务,所以之间是无关联的;

3、  Nested使用JDBC 3的保存点实现,即如果使用低版本驱动将导致不支持嵌套事务。

使用嵌套事务,必须确保具体事务管理器实现的nestedTransactionAllowed属性 为true,否则不支持嵌套事务,如DataSourceTransactionManager默认支持,而 HibernateTransactionManager默认不支持,需要我们来开启。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics