一、Spring事务基本概念
1、事务隔离级别
2、事务传播机制
- TransactionDefinition.PROPAGATION_REQUIRED:假定当前存在事务,则介入该事务;假定当前没有事务,则树立一个新的事务。
- TransactionDefinition.PROPAGATION_REQUIRES_NEW:树立一个新的事务,假定当前存在事务,则把当前事务挂起。
- TransactionDefinition.PROPAGATION_SUPPORTS:假定当前存在事务,则介入该事务;假定当前没有事务,则以非事务的体式格式连续运转。
- TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务体式格式运转,假定当前存在事务,则把当前事务挂起。
- TransactionDefinition.PROPAGATION_NEVER:以非事务体式格式运转,假定当前存在事务,则抛出异常。
- TransactionDefinition.PROPAGATION_MANDATORY:假定当前存在事务,则介入该事务;假定当前没有事务,则抛出异常。
- TransactionDefinition.PROPAGATION_NESTED:假定当前存在事务,则树立一个事务作为当前事务的嵌套事务来运转; 假定当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。
二、Spring事务三要素
TransactionDefinition、PlatformTransactionManager、 TransactionStatus
三、编程式事务
编程式事务治理就是在代码中显式挪用beginTransaction()、commit()、rollback()等事务治理相关的方法。
基于TransactionTemplate编程:
<bean id="trafficTransactionTemplate"
class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager">
<ref bean="trafficTransactionManager"/>
</property>
</bean>
trafficTemplate.execute(new TransactionCallback<Object>() {
@Override
public Object doInTransaction(TransactionStatus transactionStatus) {
try {
UserCardDo userCardDo = new UserCardDo();
userCardDo.setCardNo("111");
userCardDo.setUserId("2088302588598484");
userCardService.insert(userCardDo);
userCardDo.setUserId("1111111");
userCardService.update(userCardDo);
return new Object();
} catch (Exception e) {
//回滚
transactionStatus.setRollbackOnly();
return null;
}
}
});
四、声明式事务
Spring 的声明式事务治理在底层是竖立在 AOP 的根蒂根抵之上的。其实质是对方法前落先行隔绝,然后在目的方法最先之前树立或介入一个事务,在实行完目的方法之后凭证实行情形提交或回滚事务。
声明式事务的优点就是不需求经由编程治理事务,这样就不需求在营业逻辑代码中搀杂事务治理的代码。
基于 @Transactional 的声明式事务治理