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默认不支持,需要我们来开启。