spring 事务传播机制

浅谈一下对spring事务传播机制的理解:

1.spring事务大家都知道,本质上就是数据库的事务操作;如果方法没有开启事务,sql语句执行一条提交一条;如果有事务,sql语句一起成功,或失败回滚。sql语句执行后并不会立马提交,而是等方法内的sql都执行了再提交事务。

2.spring事务的传播机制:

/*
 * Copyright 2002-2015 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.transaction.annotation;

import org.springframework.transaction.TransactionDefinition;

/**
 * Enumeration that represents transaction propagation behaviors for use
 * with the {@link Transactional} annotation, corresponding to the
 * {@link TransactionDefinition} interface.
 *
 * @author Colin Sampaleanu
 * @author Juergen Hoeller
 * @since 1.2
 */
public enum Propagation {

	/**
	 * Support a current transaction, create a new one if none exists.
	 * B方法是REQUIRED,A方法调用B方法,假如A方法有事务(比如A方法也是REQUIRED),
     * 则B方法加入A的 
     * 事务,若A方法没有事务,则B方法开启一个新事务;
	 * <p>This is the default setting of a transaction annotation.
	 */
	REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED),

	/**
	 * Support a current transaction, execute non-transactionally if none exists.
	 * B方法是SUPPORTS,A方法调用B方法,假如A方法有事务(比如A方法是REQUIRED),则B方法加入A的 
     * 事务,若A方法没有事务(比如A方法是NOT_SUPPORTED),则B方法也没事务; 
	 */
	SUPPORTS(TransactionDefinition.PROPAGATION_SUPPORTS),

	/**
	 * Support a current transaction, throw an exception if none exists.
	 * 方法必须在一个已有的事务中执行;即 必须是有事务的方法来调用
     * B方法是MANDATORY,A方法调用B方法,假如A方法有事务(比如A方法是REQUIRED),则B方法加入A的 
     * 事务,若A方法没有事务(比如A方法是NOT_SUPPORTED),则B抛出异常:注意a不会回滚,因为a没有开 
     * 启事务;
	 */
	MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY),

	/**
	 * Create a new transaction, and suspend the current transaction if one exists.
	 * 开启新事务,挂起已存在的(即调用本方法的方法事务)
     * B方法是REQUIRES_NEW,A方法调用B方法,假如A方法有事务(比如A方法是REQUIRED),A方法事务挂 
     * 起,B方法开启新事务,提交后继续执行A事务;若A方法没有事务(比如A方法是NOT_SUPPORTED),B 
     * 方法开启新事务执行提交;所以A方法抛出异常不会回滚B方法的执行
     * 启事务
	 */
	REQUIRES_NEW(TransactionDefinition.PROPAGATION_REQUIRES_NEW),

	/**
	 * Execute non-transactionally, suspend the current transaction if one exists.
	 * 不支持事务
     * B方法是NOT_SUPPORTED,A方法调用B方法,假如A方法有事务(比如A方法是REQUIRED),A方法事务挂 
     * 起,B方法执行,之后继续执行A事务;若A方法没有事务(比如A方法是NOT_SUPPORTED),B 
     * 方法当然也还是没有事务的
	 */
	NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED),

	/**
	 * Execute non-transactionally, throw an exception if a transaction exists.
	 * B方法是NEVER.任何有事务的方法调用B方法都会抛出异常 即 必须是没事务的方法来调用
	 */
	NEVER(TransactionDefinition.PROPAGATION_NEVER),

	/**
	 * Execute within a nested transaction if a current transaction exists,
	 * B方法是NESTED,A方法调用B方法,假如A方法有事务(比如A方法是REQUIRED),B方法开启事务,嵌套 
     * 进A事务,本质上是一个事务;若A方法没有事务(比如A方法是NOT_SUPPORTED),B 
     * 方法开启新事务执行提交;
     * 启事务 
	 */
	NESTED(TransactionDefinition.PROPAGATION_NESTED);


	private final int value;


	Propagation(int value) { this.value = value; }

	public int value() { return this.value; }

}

2.下面咱们按照对事务的支持与否排个序

1.SUPPORTS,支持事务功能,可有可无,看调用一方是否有事务,你有我就用,你没有我也不要求;
2.REQUIRED,事务默认传播级别,要求有事务,调用一方有事务就用调用方的,没有就新建一个事务;

3.NESTED,这个和REQUIRED有点像,调用一方有事务就新建一个嵌套事务加进去,没有就新建一个事务;

4.REQUIRES_NEW,要求有事务,要求还挺高,只要自己的新的事务,调用方有事务就挂起来;

5.MANDATORY,强制性的要求有事务,没有事务的方法一调用他就会抛异常;

6.NOT_SUPPORTED,没有事务,不管调用方有没有,咱不参与,就不支持事务这个功能;

7.NEVER,绝不,厌恶事务,有事务的方法调用他就抛异常;

CCF大数据与计算智能大赛-面向电信行业存量用户的智能套餐个性化匹配模型联通赛-复赛第二名-【多分类,embedding】.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值