Spring 管理事务的方式有几种

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top

全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。 https://store.amazingmemo.com/chapterDetail/1685324709017001`

Spring提供了两种主要的事务管理方式:

声明式事务管理

声明式事务管理 是Spring的默认事务管理方式,它把事务管理代码从业务方法中分离出来,通过配置方式工作。它支持注解和XML配置两种方式。

1. 注解方式

在Java类或方法上使用 @Transactional 注解来声明性地应用事务。此注解可以作用于类定义级别或者方法级别。当作用于类级别时,表示该类下的所有public方法都具备该类型的事务属性。

示例:

@Transactional
public class TransactionalService {
    public void executeAction() {
        // 业务逻辑代码
    }
}

2. XML方式

XML声明配置需要在Spring的配置文件中使用<tx:advice><aop:config>元素来配置。

示例:

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="*" propagation="REQUIRED"/>
    </tx:attributes>
</tx:advice>

<aop:config>
    <aop:pointcut id="serviceOperation" expression="execution(* com.example.service.*.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation"/>
</aop:config>

编程式事务管理

编程式事务管理 意味着你需要在代码中管理事务。这种方式给予开发者更大的控制权,但同时也增加了代码复杂性。

Spring提供PlatformTransactionManager 接口来实现编程式事务管理,通常使用 TransactionTemplate 或直接使用 PlatformTransactionManager

使用 TransactionTemplate

示例:

public class ProgrammaticallyTransactionalService {
    private final TransactionTemplate transactionTemplate;

    @Autowired
    public ProgrammaticallyTransactionalService(PlatformTransactionManager transactionManager) {
        this.transactionTemplate = new TransactionTemplate(transactionManager);
    }

    public Object someServiceMethod() {
        return transactionTemplate.execute(status -> {
            // 定义事务的执行逻辑
            return null;
        });
    }
}

使用 PlatformTransactionManager

示例:

public class ProgrammaticallyTransactionalService {
    private final PlatformTransactionManager transactionManager;

    @Autowired
    public ProgrammaticallyTransactionalService(PlatformTransactionManager transactionManager) {
        this.transactionManager = transactionManager;
    }

    public Object someServiceMethod() {
        DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
        TransactionStatus status = transactionManager.getTransaction(definition);
        try {
            // 执行业务逻辑
            transactionManager.commit(status);
        } catch (Exception ex) {
            transactionManager.rollback(status);
            throw ex;
        }
        return null;
    }
}

在这两种事务管理方式中,声明式事务管理通常是更推荐的方式,因为它将事务管理从实际的业务代码中解耦出来,减少了开发者负担并且使得代码更加清晰。

最后更新于