spring事务Propagation及其实现原理详解

Spring 事务Propagation及其实现原理详解

Spring 事务Propagation是控制事务传播行为的一种机制。在讲解Propagation之前,先对Spring事务做个简要介绍。

Spring事务概述

在Spring中,事务是通过AOP(即Aspect Oriented Programming)实现的。在执行相应方法时,AOP会根据相应的注解(如@Transactional)来判断是否需要为该方法加上事务。

一般情况下,在执行一个方法时,可能会涉及到一个或多个数据库操作,比如查询一个表中的数据和向一个表中插入数据。如果这些操作需要在一个事务中一起完成(即要么全部完成,要么全部不完成),那么我们就可以将这些操作封装进一个Spring事务中,用@Transactional注解来启用这个事务,并指定对应的传播行为Propagation。根据不同的传播行为,Spring会自动创建事务或者复用已存在的事务。

以下是Propagation的几种传播行为:

REQUIRED

表示支持当前事务,如果当前没有事务,就新建一个事务。这是默认的传播行为。

REQUIRES_NEW

表示支持当前事务,但是如果当前有事务,就将当前事务挂起,新建一个事务。

SUPPORTS

表示支持当前事务,如果当前没有事务,就非事务的方式执行。

NOT_SUPPORTED

表示不支持当前事务,如果当前有事务,就将当前事务挂起。

MANDATORY

表示必须支持当前事务,如果当前没有事务,就抛出异常。

NEVER

表示不支持当前事务,如果当前有事务,就抛出异常。

NESTED

表示开启一个新的嵌套事务,如果当前没有事务,就新建一个事务,如果当前有事务,就在当前事务中创建一个嵌套的事务。

事务Propagation示例

下面通过两条示例说明Propagation的作用:

示例一:REQUIRED

@Service
public class UserService {
    @Autowired
    private UserDao userDao;

    @Transactional(propagation = Propagation.REQUIRED)
    public void add(User user) {
        userDao.insert(user);
    }

    @Transactional(propagation = Propagation.REQUIRED)
    public void update(User user) {
        userDao.update(user);
    }
}

在示例中,UserService类中有两个方法add和update,这些方法都用@Transactional注解标记,且Propagation都为REQUIRED。这意味着,当add方法和update方法都在同一个事务中时,如果add方法执行失败,update方法也会回滚。

示例二:REQUIRES_NEW

@Service
public class UserService {
    @Autowired
    private UserDao userDao;

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void addRequiredNew(User user) {
        userDao.insert(user);
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void updateRequiredNew(User user) {
        userDao.update(user);
    }
}

在示例中,UserService类中有两个方法addRequiredNew和updateRequiredNew,这些方法都用@Transactional注解标记,且Propagation都为REQUIRES_NEW。这意味着,无论addRequiredNew方法和updateRequiredNew方法是否在同一个事务中,它们都会分别启动各自的事务。

事务实现原理

Spring事务传播行为的实现依靠的是AOP,在执行目标方法时,判断当前是否已经有事务存在,如果有,则直接使用当前事务,如果没有,则开启一个新事务。判断事务是否存在的方式是利用ThreadLocal线程变量存储事务状态。在一个线程中,如果多次调用了@Transactional注解所标注的方法,Spring将会为该线程创建一个事务,并把该事务与这个线程绑定,在当前线程的运行过程中,只有该线程能够访问该事务。

总结

通过本文,我们了解了Spring事务Propagation的几种传播行为,在开发中,我们需要根据实际情况选择相应的传播行为,以达到所需的效果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:spring事务Propagation及其实现原理详解 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • element form 校验数组每一项实例代码

    要实现element form校验数组每一项的功能,需要使用element-ui提供的表单校验方法和v-for指令进行遍历。 首先,在HTML中使用v-for指令进行数组遍历,生成多组表单。在每个表单中,除了设置v-model绑定数据,还需要设置rules属性绑定每个表单元素的验证规则和提示信息。如下所示: <template> <el-f…

    jquery 2023年5月28日
    00
  • jQWidgets jqxNavBar getSelectedIndex()方法

    以下是关于 jQWidgets jqxNavBar 组件中 getSelectedIndex() 方法的详细攻略。 jQWidgets jqxNavBar getSelectedIndex() 方法 jQWidgets jqxNavBar 的 getSelectedIndex() 方法用获取当前选中项的索引。该方法不接受任何参数。 语法 $(‘#navbar…

    jquery 2023年5月12日
    00
  • 在jQuery中处理XML数据的大致方法

    在jQuery中处理XML数据有以下大致方法: 使用jQuery的$.ajax()函数加载XML文件 我们可以使用$.ajax()函数来加载XML文件,然后使用回调函数处理数据。其中,dataType选项需要设置为”xml”,表示我们要加载的是XML文件。 下面是一个加载XML数据并处理的示例代码: $.ajax({ type: "GET&quot…

    jquery 2023年5月27日
    00
  • 基于jQuery.validate及Bootstrap的tooltip开发气泡样式的表单校验组件思路详解

    标题:基于jQuery.validate及Bootstrap的tooltip开发气泡样式的表单校验组件思路详解 一、前言 表单验证是Web开发中非常重要且必要的一环,不仅能够有效防止无效或非法数据的录入,同时也可以增强用户使用体验。本文将介绍一种基于jQuery.validate及Bootstrap的tooltip组件实现表单校验的方法。 二、简介 2.1(…

    jquery 2023年5月28日
    00
  • 实例详解jQuery的无new构建

    当我们使用jQuery时,常常使用一下形式: var $div = $(‘div’); 这里使用$()构造函数实例化了一个jQuery对象,但是我们也可以使用无new的方式来创建jQuery对象,如下所示: var $div = jQuery(‘div’); 这里我们直接使用了jQuery的全局变量来实例化对象,可以看到我们没有使用new来创建对象。这种方式…

    jquery 2023年5月28日
    00
  • jQuery控制DIV层实现由大到小,由远及近动画变化效果

    要实现“由大到小,由远及近”的动画变化效果,可以使用jQuery来操作CSS样式。以下是实现的完整攻略: 1. HTML结构 首先,需要有一个包裹目标div的框架外层div,用来控制整体居中和定位。 <div id="box"> <div id="target">这是一个目标div</di…

    jquery 2023年5月28日
    00
  • jQuery UI Spinner禁用选项

    以下是关于 jQuery UI Spinner 禁用选项的详细攻略: jQuery UI Spinner 禁用选项 可以使用 disabled 选项来禁用 Spinner 控件。禁用后,用户将无法与控件交互。 语法 $( ".selector" ).spinner({ disabled: true }); ` ### 示例一:禁用 Spi…

    jquery 2023年5月11日
    00
  • jQWidgets jqxProgressBar showText属性

    以下是关于 jQWidgets jqxProgressBar 组件中 showText 属性的详细攻略。 jQWidgets jqxProgressBar showText 属性 jQWidgets jqxProgressBar 组件的 showText 属性用于控制是否显示进度条的文本。 语法 // 获取 showText 属性的值 var showTex…

    jquery 2023年5月12日
    00
合作推广
合作推广
分享本页
返回顶部