编程式事务实现方式TransactionTemplate和TransactionManager
一、TransactionTemplate(TransactionalOperator适用于响应式编程)
1、TransactionTemplate
实例:(ps:也可以不用catch捕获异常手动回滚,在事务体中出现异常也会根据默认的自动回滚)
@Component
public class MyTransactionService {
@Autowired
private TransactionTemplate transactionTemplate;
public void TransactionTest() {
//也可以对事务做其他参数配置
transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_NOT_SUPPORTED);//事务传播方式
transactionTemplate.setTimeout(30);//超时时间
//有返回值
Object execute = transactionTemplate.execute(new TransactionCallback<Object>() {
@Override
public Object doInTransaction(TransactionStatus transactionStatus) {
try {
//....... 业务代码
return new Object();
} catch (Exception e) {
//回滚方法
transactionStatus.setRollbackOnly();
return null;
}
}
});
//无返回值
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
try {
//....... 业务代码
String s = String.valueOf(12);
} catch (Exception e) {
//回滚方法
status.setRollbackOnly();
}
}
});
}
}
2、
TransactionalOperator
在使用时TransactionalOperator有两种创建方式:
-
使用默认的事务配置直接@Autowired注入TransactionalOperator对象进行使用
-
自定义配置使用ReactiveTransactionManager和DefaultTransactionDefinition创建
实例:
第一种创建方式和使用方式:
@Component
public class MyTransactionService {
@Autowired
private TransactionalOperator transactionalOperator;
public void TransactionTest() {
//使用默认的事务配置直接@Autowired注入TransactionalOperator对象进行使用
//使用execute方法将Mono和Flux放入事务中
Flux<Object> execute = transactionalOperator.execute(status ->
Mono.just(new Object()).doOnError(Exception.class, e -> {
status.setRollbackOnly();
e.printStackTrace();
}));
}
}
第二种创建方式和使用方式:
@Component
public class MyTransactionService {
@Autowired
private ReactiveTransactionManager reactiveTransactionManager;
@Autowired
private DefaultTransactionDefinition defaultTransactionDefinition;
public void TransactionTest() {
//自定义事务配置
defaultTransactionDefinition.setIsolationLevel(TransactionDefinition.ISOLATION_READ_UNCOMMITTED);
defaultTransactionDefinition.setTimeout(30);
//创建事务对象
TransactionalOperator transactionalOperator = TransactionalOperator.create(reactiveTransactionManager, defaultTransactionDefinition);
Flux<Object> flux = Flux.just(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
//方法调用加入事务
flux.as(transactionalOperator::transactional);
}
}
二、TransactionManager(ReactiveTransactionManager响应式事务管理器)
1、TransactionManager
使用核心方法
public interface PlatformTransactionManager extends TransactionManager {
//创建并开启一个事务
TransactionStatus getTransaction(@Nullable TransactionDefinition definition) throws TransactionException;
//提交事务
void commit(TransactionStatus status) throws TransactionException;
//回滚事务
void rollback(TransactionStatus status) throws TransactionException;
}
实例:
@Component
public class MyTransactionService {
@Autowired
PlatformTransactionManager platformTransactionManager;
@Autowired
TransactionDefinition transactionDefinition;
public void TransactionTest2() {
//开启事务
TransactionStatus transaction = platformTransactionManager.getTransaction(transactionDefinition);
try {
//业务代码
//手动提交事务
platformTransactionManager.commit(transaction);
} catch (Exception e) {
platformTransactionManager.rollback(transaction);
//手动回滚事务
e.printStackTrace();
}
}
}
2、ReactiveTransactionManager
核心方法和TransactionManager类似
实例:
@Component
public class MyTransactionService {
@Autowired
private ReactiveTransactionManager reactiveTransactionManager;
@Autowired
private DefaultTransactionDefinition defaultTransactionDefinition;
public void TransactionTest() {
//开启事务也可以对DefaultTransactionDefinition进行自定义配置
Mono<ReactiveTransaction> reactiveTransaction =
reactiveTransactionManager.getReactiveTransaction(defaultTransactionDefinition);
Flux<Object> flux = Flux.just(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
reactiveTransaction.flatMap(status -> {
//业务流处理
return flux.then(reactiveTransactionManager.commit(status)) //手动提交事务
.onErrorResume(ex -> reactiveTransactionManager.rollback(status).then(Mono.error(ex)))
});
}
}