下面几节解释了命令式和反应式事务管理器的程序性用法:

使用 PlatformTransactionManager

对于强制性事务,你可以直接使用 org.springframework.transaction.PlatformTransactionManager来管理你的事务。要做到这一点,通过一个 Bean 引用将你使用的 PlatformTransactionManager 的实现传递给你的 Bean。然后,通过使用 TransactionDefinition 和 TransactionStatus 对象,你可以启动事务、回滚和提交。下面的例子展示了如何做到这一点:

  1. // 事物定义
  2. DefaultTransactionDefinition def = new DefaultTransactionDefinition();
  3. // 明确设置事物名称是只能通过编程来完成的事情。
  4. def.setName("SomeTxName");
  5. def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); // 事物传播
  6. // 从事物管理器中获取一个状态
  7. TransactionStatus status = txManager.getTransaction(def);
  8. try {
  9. // 把你的业务逻辑放在这里
  10. } catch (MyException ex) {
  11. txManager.rollback(status); // 异常回滚
  12. throw ex;
  13. }
  14. txManager.commit(status); // 提交事务

使用 ReactiveTransactionManager

当使用反应式事务时,你可以直接使用 org.springframework.transaction.ReactiveTransactionManager 来管理你的事务。要做到这一点,通过一个 Bean 引用将你使用的 ReactiveTransactionManager 的实现传递给你的 Bean。然后,通过使用 TransactionDefinition 和 ReactiveTransaction 对象,你可以启动事务,回滚,和提交。下面的例子展示了如何做到这一点:

  1. DefaultTransactionDefinition def = new DefaultTransactionDefinition();
  2. // explicitly setting the transaction name is something that can be done only programmatically
  3. def.setName("SomeTxName");
  4. def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
  5. Mono<ReactiveTransaction> reactiveTx = txManager.getReactiveTransaction(def);
  6. reactiveTx.flatMap(status -> {
  7. Mono<Object> tx = ...; // put your business logic here
  8. return tx.then(txManager.commit(status))
  9. .onErrorResume(ex -> txManager.rollback(status).then(Mono.error(ex)));
  10. });