编程事务管理

本文详细介绍了Java中的TransactionTemplate用于简化事务处理,TransactionalOperator的两种创建方式及其在响应式编程中的应用,以及TransactionManager和ReactiveTransactionManager的使用方法和核心功能,包括事务的开启、提交和回滚。
摘要由CSDN通过智能技术生成

编程式事务实现方式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)))
        });
    }
}

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
编程事务和声明式事务是两种常见的事务管理方式。 编程事务是通过在代码中显式地使用事务模板类(如TransactionTemplate)来实现的。事务模板类提供了回调接口(TransactionCallback和TransactionCallbackWithoutResult),通过实现这些接口中的方法来定义需要进行事务管理的操作代码。在编程事务中,开发人员需要手动编写事务管理的代码,并指定事务的开始、提交和回滚等操作。这种方式可以给开发人员更大的控制权,但也需要更多的代码编写和维护。 声明式事务是通过在配置文件(如XML配置文件或注解)中声明事务的属性来实现的。在声明式事务中,开发人员只需要使用注解或在配置文件中定义事务的属性,而不需要编写具体的事务管理代码。底层的事务管理由框架(如Spring)自动处理。这种方式可以减少开发人员的工作量,并提高代码的可读性和可维护性。 因此,编程事务是在代码中显式地编写事务管理代码,而声明式事务是通过配置文件或注解来定义事务的属性,由框架自动处理。根据具体的需求和开发环境,可以选择适合的事务管理方式。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* *2* [Spring事务管理实现方式之编程式事务与声明式事务详解](https://blog.csdn.net/liaohaojian/article/details/70139151)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

何心而为殇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值