Spring 事务

时间:2019-08-18 22:22:16   收藏:0   阅读:84

Spring 事务

关于理论性的内容,我在之前的一篇文章中介绍过,这里不再过多阐述,这里给出之前文章的链接:Spring 事务管理

什么是事务

是一组逻辑操作,要么执行,要么不执行。

事务的特性

ACID
(原子性、一致性、隔离性、持久性)

并发事务带来的问题

配置事务管理器

<!-- 事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <!-- 数据源 -->
    <property name="dataSource" ref="dataSource" />
</bean>

Spring 事务接口

1. PlatfromTransactionManager 接口介绍:

该接口主要有三个方法:

Public interface PlatformTransactionManager()...{

    TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException; 

    Void commit(TransactionStatus status) throws TransactionException;  

    Void rollback(TransactionStatus status) throws TransactionException;  
} 

一般情况下用的比较多的就是 commit 提交事务和 rollback 回滚事操作了。

2. TransactiDefinition 接口介绍:

该接口主要定义了一些表示事务属性(如隔离级别,传播行为等)的常量。当然还有一些方法,仅有篇幅,不对方法做介绍。

(1)事务隔离级别(定义了一个事务可能受其他并发事务影响的程度):

TransactionDefinition 接口中定义了五个表示隔离级别的常量:

(2)事务传播行为(为了解决业务层方法之间互相调用的事务问题):

当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。在TransactionDefinition定义中包括了如下几个表示传播行为的常量:

支持当前事务的情况:

不支持当前事务的情况:

其他情况:

(3)TransactionStatus 接口介绍

TransactionStatus接口用来记录事务的状态 该接口定义了一组方法,用来获取或判断事务的相应状态信息。
TransactionStatus 接口方法如下:

public interface TransactionStatus{
    boolean isNewTransaction(); // 是否是新的事物
    boolean hasSavepoint(); // 是否有恢复点
    void setRollbackOnly();  // 设置为只回滚
    boolean isRollbackOnly(); // 是否为只回滚
    boolean isCompleted; // 是否已完成
} 

举例

事务操作一般都是在 service 层编写,结合增删改查方法。我举个栗子:

class Test {
    
    private PlatformTransactionManager transactionManager;
    
    public void saveFromDB() {

        DefaultTransactionDefinition defaultTransactionDefinition = new DefaultTransactionDefinition();
        defaultTransactionDefinition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
        TransactionStatus transactionStatus = transactionManager.getTransaction(defaultTransactionDefinition);

        try {      
            // 增删改查操作(使用 dao 中的方法)
            //...
            transactionManager.commit(transactionStatus);
        
            // 删除本地缓存操作
            //...
        
        } catch (Exception e) {
            transactionManager.rollback(transactionStatus);
        
        }
    }
}

这里需要注意的是:当我们执行增删查改操作时,应该在 service 层添加事务,并且删除之前的缓存(本地缓存和 redis 缓存),然后再执行增删查改操作,这三方面都兼顾到了才是一个比较好的增删查改操作。

参考

https://juejin.im/post/5b00c52ef265da0b95276091

原文:https://www.cnblogs.com/weixuqin/p/11374069.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!