Spring的事务框架

抽象架构设计

Spring的事务框架设计理念的基本原则是:让事务管理的关注点与数据访问关注点相分离

PlatformTransactionManager是Spring事务抽象架构的核心接口,它的主要作用是为应用程序提供事务界定的统一方式

public interface PlatformTransactionManager extends TransactionManager {
    TransactionStatus getTransaction(@Nullable TransactionDefinition definition) throws TransactionException;
​
    void commit(TransactionStatus status) throws TransactionException;
​
    void rollback(TransactionStatus status) throws TransactionException;
}

具体实现上,在事务开始之前取得一个java.sql.Connection,然后将这个Connection绑定到当前的调用线程,在事务结束时解除绑定

TransactionDefinition

定义事务属性

  • 事务的隔离级别

  • 事务的传播行为

  • 事务的超时时间

  • 是否为只读事务

 TransactionStatus

表示整个事务处理过程中的事务状态

  • 使用TransactionStatus提供的相应方法查询事务状态
  • 通过setRollbackOnly()方法标记当前事务以使其回滚

  • 如果相应的PlatFormTransactionManager支持Savepoint,可以通过TransactionStatus在当前事务中创建内部嵌套事务

PlatFormTransactionManager

Spring事务抽象框架的核心组件,PlatFormTransactionManager的整个抽象体系基于Strategy模式,由PlatFormTransactionManager对事务界定进行统一的抽象,而具体的界定策略实现则交给具体的实现类

编程式事务

 直接使用PlatFormTransactionManager

    public void doTransaction() {
        String jdbcUrl = "";
        String driverClassName = "";
        String username = "";
        Properties properties = new Properties();
        String password = "";
        DataSource dataSource = new DriverDataSource(jdbcUrl, driverClassName, properties, username, password);

        DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(dataSource);
        DefaultTransactionDefinition transactionDefinition = new DefaultTransactionDefinition();
        transactionDefinition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
        transactionDefinition.setIsolationLevel(TransactionDefinition.ISOLATION_DEFAULT);
        transactionDefinition.setTimeout(-1);
        transactionDefinition.setReadOnly(false);
        transactionDefinition.setName("test");

        TransactionStatus txStatus = transactionManager.getTransaction(transactionDefinition);
        try {
            doService();
        } catch (ServiceManagerException e) {
            LOGGER.error("service exception", e);
            transactionManager.rollback(txStatus);
        } catch (RuntimeException e) {
            LOGGER.error("runtime exception", e);
            transactionManager.rollback(txStatus);
        } catch (Error e) {
            LOGGER.error("service error", e);
            transactionManager.rollback(txStatus);
        }
        transactionManager.commit(txStatus);
    }

    private void doService() throws ServiceManagerException {
        taskDao.update(new ArrayList<>());
    }

 直接使用PlatFormTransactionManager,我们可以完全控制整个事务处理过程,但是如果项目中的事务完全使用这种方式,最大的问题是期间的异常处理复杂和重复代码太多

使用TransactionTemplate

TransactionTemplate对与PlatFormTransactionManager相关的事务界定操作以及相关的异常处理进行了模板化封装。Spring针对TransactionTemplate提供了两个Callback接口,TransactionCallback和TransactionCallbackWithoutResult,两者的唯一区别就是是否返回执行结果

TransactionTemplate会捕捉Callback操作中抛出的非检查型异常并回滚事务,然后抛给上层处理。所以现在我们只需要处理特定于应用程序的异常,而不需要对所有可能的异常都处理。如果事务处理期间没有任务问题,TransactionTemplate最终会为我们提交事务

在使用上,我们只需要让业务代码抛出非检查型异常以使事务回滚,代码更加简洁

TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager, transactionDefinition);
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(@NotNull TransactionStatus status) {
                doService();
            }
        });

声明式事务

@Transactional注解

如果将@Transactional标注为对象级别,对象中的方法将“继承”该对象级别上的@Transactional元数据信息。具体实现上,@Transactional标注的业务实现类,会通过Spring AOP生成代理对象,通过事务包装业务逻辑

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值