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()
返回是否(优化为)只读属性。
Create a new savepoint.
创建一个新的回滚点。
void releaseSavepoint(Object savepoint)
Explicitly release the given savepoint.
释放一个给定的回滚点。
void rollbackToSavepoint(Object savepoint)
Roll back to the given savepoint.
回滚到给定的回滚点。
判断这个事务是否有一个内在的回滚点(savepoint),即创建为基于回滚点的嵌套事务。
boolean isCompleted()
判断这个事务是否完成,也就是已经提交或者回滚。
boolean isNewTransaction()
判断一个事物是否为新事务,或者是这个事务参与到一个已经存在的事务里面。
boolean isRollbackOnly()
判断这个事务是否已经设置了rollback-only。
void setRollbackOnly()
设置这个事务rollback-only。
Never:不支持事务,如果当前存在是事务则抛出异常,使用PROPAGATION_NEVER指定,即以非事务方式执行,如果当前存在事务,则抛出异常(IllegalTransactionStateException)
Nested:嵌套事务支持,使用PROPAGATION_NESTED指定,如果当前存在事务,则在嵌套事务内执行,如果当前不存在事务,则创建一个新的事务,嵌套事务使用数据库中的保存点来实现,即嵌套事务回滚不影响外部事务,但外部事务回滚将导致嵌套事务回滚
Nested和RequiresNew的区别:
1、 RequiresNew每次都创建新的独立的物理事务,而Nested只有一个物理事务;
2、 Nested嵌套事务回滚或提交不会导致外部事务回滚或提交,但外部事务回滚将导致嵌套事务回滚,而 RequiresNew由于都是全新的事务,所以之间是无关联的;
3、 Nested使用JDBC 3的保存点实现,即如果使用低版本驱动将导致不支持嵌套事务。
使用嵌套事务,必须确保具体事务管理器实现的nestedTransactionAllowed属性 为true,否则不支持嵌套事务,如DataSourceTransactionManager默认支持,而 HibernateTransactionManager默认不支持,需要我们来开启。