Transactional注解中事务的传播行为

事务Transactional传播机制 mandatory:强制性的。suspend:暂停、终止。 阅读详情

目录

1.Transactional注解中七种事务传播行为

2.为什么要控制事务的传播行为

3.事务的传播行为使用例子

4.@Transactional注解失效的场景

5.总结

Transactional是Spring事务管理提供的注解,在一个方法中加上了这个注解,那么这个方法就将是有事务的

Transactional.propagation:传播行为

1.Transactional注解中七种事务传播行为

1.它是用来表示当一个事务传播行为修饰的方法被另一个方法调用时,事务如何进行传播 ​ 
事务传播行为 效果 
        ​ REQUIRED:(必须) 如果以前有事务,就和之前的事务共用一个事务,没有就创建一个事务。 ​    
         REQUIRES_NEW(新的事务) 创建一个新的事务,如果以前有事务,暂停前面的事务,也就是说总是用新事务。 ​ 
         SUPPORTS(支持) 之前有事务,就和之前事务共用的方式运行,没有事务也可以。 ​          MANDATORY(强制) 一定要有事务,如果没事务就报错。 ​ 
         NOT_SUPPORTED(不支持) 不支持在事务内运行,如果已经有事务了,就挂起当前存在的事务。 ​ 
         NEVER(从不使用) 不支持在事务内运行,如果已经有事务了,抛异常。 ​ 
         NESTED 开启一个子事务(MySQL不支持),需要支持还原点功能的数据库才行 ​ 
​​​​​​​@Transactional默认的传播行为是REQUIRED,且一般情况下只用REQUIRED和REQUIRES_NEW,其他了解即可 @Transactional(propagation = Propagation.REQUIRED) @Transactional(propagation = Propagation.REQUIRES_NEW)

2.为什么要控制事务的传播行为

一些人在需要使用事务控制的方法上,直接加上@Transactional注解,保证方法中一步出错,全部回滚,当然,一些情况下这样操作也没有问题。但一些业务场景下,不需要全部回滚,如保存一件商品需要: ​ 保存该商品基本信息. ​ 保存库存数量。 ​ 保存商品的参数值。 ​ 保存商品满减条件。 ​ 这样的场景下只需控制商品的基本信息和库存等核心数据保存成功后不管后面执行情况都不再回滚。

3.事务的传播行为使用例子

/**
  *场景1
  *A() 跟着回滚
  *B() 使用新事务 不回滚
  *自己操作数据库 回滚
  */
@Transactional
public void add(){
        A(); //事务:REQUIRED   
        B(); //事务:REQUIRES_NEW  
        Mapper.xxx();
        int i = 10/0;
}
/**
  *场景2
  *C方法抛异常:A,C共用add方法的事务,所以回滚,B使用新事务执行成功,D和自己操作数据库无法执行。
  *场景3 
  *D方法抛异常:外事务感知到异常。A,C回滚,自己操作数据库不到,D自己回滚,B成功。
  *场景4
  *自己操作数据库出现异常:同理,A和C回滚,B和D成功。
  *场景5
  *若add()上没有@Transactional呢?效果还是一样,因为A传播行为是REQUIRED ,没有事务传播给它则自己创建一个事务,后面C则和A共享。B,D仍是自己新建事务。但是若自己操作数据库抛异常则。所有以上执行过方法不会回滚
  *
  */ 
@Transactional
 public void add(){
        A(); //REQUIRED  
        B(); //REQUIRES_NEW  
        C(); //REQUIRED  
        D();  //REQUIRES_NEW   
        Mapper.xxx(); //自己操作数据
   }
​
/**
  *场景6:
  *C用try-catch执行;C出了异常回滚,由于异常被捕获,add()的事务没有感知异常。A,B,D都执行成功,C自己回滚。
  */
@Transactional
public void add(){
    A(); //REQUIRED
    B(); //REQUIRES_NEW
    
    try {
        C(); //REQUIRED
    }catch (Exception e){
        e.printStackTrace();
    }
    
    D(); //REQUIRES_NEW
}
/**
  *扩展——关于调用同一个类下方法的事务问题
  */  
@Service
public class BrandService{
​
    @Transactional()
    public void Save(Brand brand, Long cid) {
        //新增brand
        this.brandMapper.insert(brand);
        //新增中间表
        this.brandMapper.insertCategoryAndBrand(cid, brand.getId());
        doOther();
        int i = 10 / 0;
    }
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void doOther() {
​
        this.Mapper.insert("something");
​
    }
​
}
/**
*按下面的分析,在 int i = 10/0 抛异常后,结果应该只有doOther方法里的数据库操作能成功,其他回滚,但是结
*果却是全部回滚。
*原因就是直接调用同类方法,相当于方法内的代码复制过来,最后doOther()上的注解不起作用,导致全部回滚。
*解决方法:因为这是spring,事务操作是基于AOP实现的,方法要开启事务需要代理,而BrandService注入容器就是
*本身的代理对象,所以只需要用这个对象调用doOther即可。
*修改如下:
/
@Service
public class BrandService{
    @Autowired
    private BrandService brandService;//spring已经解决了循环注入问题
    @Transactional()
    public void Save(Brand brand, Long cid) {
    //新增brand
    this.brandMapper.insert(brand);
    //新增中间表
    this.brandMapper.insertCategoryAndBrand(cid, brand.getId());
    brandService.doOther();
    int i = 10 / 0;
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void doOther() {
        this.Mapper.insert("something");
    }
}
// 最后,只有dother()中数据库操作执行成功。

4.@Transactional注解失效的场景

1.把注解标注在非public修饰的方法上 
TransactionalRepositoryProxyPostProcessor类中的computeTransactionAttribute方法判断了是public修饰的方法返回null
TransactionalRepositoryProxyPostProcessor.computeTransactionAttribute(){
    if (this.allowPublicMethodsOnly() && !Modifier.isPublic(method.getModifiers())) {
                return null;
            } 
}       
2.注解属性propagation(传播行为)配置错误
3.rollbackFor属性设置错误
4.在同一个类中方法调用,导致事务失败
5.自己主动去try,catch代表【没有异常】,导致事务失效
6.数据库引擎本身就不支持事务(例如MyISAM)。当然也不会生效
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
​
import java.io.IOException;
​
/**
 * 事务失效的场景
 */
@Slf4j
@Service
public class TransactionalLose {
​
    @Autowired
    private TransactionalLose transactionalLose;
​
    /**
     * user_reg_info dao接口
     */
    private final UserRegInfoRepository userRegInfoRepository;
​
​
    public TransactionalLose(UserRegInfoRepository userRegInfoRepository) {
        this.userRegInfoRepository = userRegInfoRepository;
    }
​
​
    @Transactional()
    public void wrongRollbackForNo() throws Exception {
        UserRegInfo userRegInfo = new UserRegInfo();
        userRegInfo.setUserName("wrongRollbackFor");
        userRegInfoRepository.save(userRegInfo);
        //...
        throw new IOException("throw IOException for check Rollback");
    }
​
    @Transactional(rollbackFor = Exception.class)
    public void wrongRollbackFor() throws Exception {
        UserRegInfo userRegInfo = new UserRegInfo();
        userRegInfo.setUserName("wrongRollbackFor");
        userRegInfoRepository.save(userRegInfo);
        //...
        throw new IOException("throw IOException for check Rollback");
    }
​
    /**
     * <h2>同一个类中的方法调用</h2>
     */
    @Transactional
    public void wrongInnerCall() throws Exception {
        this.wrongRollbackFor();
        //...
    }
​
    /**
     * <h2>同一个类中的方法调用</h2>
     */
    @Transactional
    public void wrongInnerCallUseAutowired() throws Exception {
        transactionalLose.wrongRollbackFor();
        //...
    }
​
    @Transactional(rollbackFor = Exception.class)
    public void wrongTryCatch() {
        try {
            UserRegInfo userRegInfo = new UserRegInfo();
            userRegInfo.setUserName("wrongRollbackFor");
            userRegInfoRepository.save(userRegInfo);
            // ....
            // 由于某种原因抛出了异常
            throw new IOException("throw io exception for check rollback");
        } catch (Exception ex) {
            log.error("has some error: [{}]", ex.getMessage(), ex);
        }
    }
}
​

5.总结

1.传播行为过程中,只要Requires_new被执行过就一定成功,不管后面出不出问题。异常机制还是一样的,出现异常代码以后不执行。Required只要感觉到异常就一定回滚。和外层事务(例子中的add方法上的事务)是什么传播行为无关。
2.业务逻辑中,需要考虑哪些东西是一定要回滚的、哪些即使出错了不必要回滚的。
3.在同类方法调用中一定要使用自己的代理对象(即自己注入IOC中的对象)调用

Spring 事务 - 基本使用、传播机制、失效场景、嵌套事务多回滚解决 带你一次学懂:编程式事务、声明式事务、事务的传播机制! 阅读详情

相关推荐

QT5.14.2离线安装包保姆级教程:断网、选组件、避坑全记录

本文详细介绍了QT5.14.2离线安装包的完整流程,特别针对Windows平台开发者提供断网安装、组件选择及避坑指南。作为QT5系列中最后一个免费离线版本,5.14.2具有免注册、全组件离线安装等独特优势,是开源开发者的理想选择。文章涵盖从环境准备到安装后配置的全方位指导,帮助开发者高效完成安装并避免常见问题。

weixin_30924087的博客 576

Spring @Transactional事务传播机制详解

## 总结 本文讲解了Spring事务的七种传播机制,我们可以根据具体的类型,具体设置,避免事务的方法过于长,一个事务里面调用的库表越多,就越有可能造成死锁,所以我们要根据具体的需要拆分使用。

endwas 5126

Sentence-BERT 语义相似度双塔模型

论文介绍 发表:2019,EMNLP 论文题目:《Sentence-BERT:sentence embeddings using siaese BERT-networks》 论文地址:https://arxiv.org/abs/1908.10084 Github:https://github.com/UKPLab/sentence-transformers 适用领域: 句向量生成 语义相似度计算 语义搜索 无监督任务(聚类) 1 概述 在20年之前的各种预训练模型中,比如bert,XLNet,Alb

weiyaner的博客 9193

@Transactional事务注解的传播性

@Transactional事务注解的传播性

qq_40549814的博客 3954

本地部署大模型 vs 网页版大模型区别

fill:#333;color:#333;color:#333;fill:none;本地服务器/工作站硬件资源私有化部署GPU集群高速存储模型文件训练框架推理引擎。

Ds-Rag的博 1711

YOLOv8训练流程-原理解析[目标检测理论篇]

本篇文章主要介绍了YOLOv8训练的流程,主要介绍了Task Aligned Assigner正负样本匹配策略以及YOLOv8的损失计算。

ice 4516

@Transctional事务传播机制(Propagation)

Transactional注解可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有public方法将都具有该类型的事务属性。当作用在方法级别时,会覆盖类级别的定义。当作用在接口和接口方法时,则只有在使用基于接口的代理时它才会生效,也就是JDK代理。在Spring中,事务的传播类型对方法执行顺序和结果都有影响。调用者和被调用者方法所定义的事务传播类型共同决定了代码的结果。ps.两个问题:Q1:类内部方法调用时,避免@Transcational失效的获取代理类方法待验证。

zhzh980的博客 7413

SM2 是一种国密算法,用于生成密钥对和加解密。下面是 SM2 生成密钥对和加解密的示例代码,使用 Python 语言编写。

在这个函数中,我们使用公钥对数据进行加密,并返回加密后的结果。其中,我们使用了 OAEP 填充方案和 SHA256 哈希算法。SM2 是一种国密算法,用于生成密钥对和加解密。下面是 SM2 生成密钥对和加解密的示例代码,使用 Python 语言编写。首先,我们需要安装 cryptography 库,它包含了 SM2 算法的实现。使用上述代码,我们可以轻松地实现 SM2 密钥对生成和加解密功能。在这个函数中,我们使用私钥对密文进行解密,并返回解密后的明文。接下来,我们定义一个函数。在这个函数中,我们使用。

2301_78484069的博客 1951

【事务传播行为剖析】Transactional注解的几个参数--事务传播控制--事务隔离级别--异常与回滚

控制事务传播----propagation属性 @Transactianal注解有一些属性,见Spring-Framework-Reference Table17.3 Transactional-settings @Transactional(propagation=Propagation.REQUIRED) //控制事务传播。默认是Propagation.REQUIRED @Transactional(isolation=Isolation.DEFAULT)

lucky_love816的博客 1165

高创伺服的龙门调试经历2

摘要:本文介绍了高创伺服在龙门控制中的配置方法。首先通过ServoStudio2连接驱动器并命名区分主从轴(MASTER/DIFF),然后设置接口模式、23位编码器参数及极限位置。重点说明龙门模式的三项关键参数设置(gantryfbenmode=1、gantrymode=1/2)和连线状态确认。建议单轴自动整定后调整从轴增益(如0.2),并强调带刹车电机的同步控制要点:刹车线需接同一继电器由主轴控制,避免位置偏差。

wzz418550729的博客 905

手把手完整实现STM32+NB-IoT+MQTT+ThingsCloud云平台+手机APP(Android或iOS)及微信小程序及Web app 应用

本教程以远程温湿度显示及点灯作为示例。最终效果实现本地OLED显示屏、云平台和手机APP、微信小程序和Web App可远程查看温湿度数据,并可远程控制LED灯亮灭。以此完成基于MQTT协议的NB-IoT远程发布订阅数据,以此在本教程基础上可扩展开发更多的功能。

嵌入式阿齐Archie 2万+

@Transactional 注解的事务传播特性

Transactional 注解在 Spring 框架中用于控制方法级别的事务行为。它允许您指定事务的传播行为(propagation)、隔离级别(isolation)、超时(timeout)、只读(readOnly)和回滚规则(通过rollbackFor和noRollbackFor属性指定异常)。

zoxm 686

机器学习初探——用线性回归预测股价趋势

在进入代码之前,先建立一个大框架。类型一句话解释金融中的应用监督学习给机器“标准答案”让它学预测股价(历史数据→未来价格)无监督学习不给答案,让机器自己找规律把相似股票自动归类、发现异常交易强化学习让机器通过“试错”学习最优策略AI自动交易、量化策略优化我们现阶段只学“监督学习”——这是最常用、最容易上手的。准备一堆“特征”和对应的“标签”(比如:历史的第N天 → 那天的价格)喂给机器一个“算法”(比如线性回归)机器“拟合”出一个规律(比如找到一条最合适的直线)

107

Spring入门心经之第四章 事务详解

从逻辑上来说事务就是把一组动作看成一个操作,要么都执行,要么都不执行。例如下面这段代码,如果这段代码不在同一事务的话,那么执行结束时只有老王被插入到数据库,小明没有被插入,这个操作不符合业务上的一致性。另外补充一点,使用事务进行增删改查时,必须保证所使用的数据库引擎支持事务;例如常用的MySQL5.5后版本默认使用支持事务的 innodb引擎,MySQL5.5前数据库引擎则为myisam,那么程序也就不再支持事务了。

成功不可复制,努力值得期待 1155

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

SpringBoot的事务注解

在Spring Boot应用中,事务管理是一个关键的部分,尤其是当涉及到数据库操作时。Spring Boot提供了强大的事务管理支持,使得开发人员可以通过简单的注解来控制事务的边界和行为。本文将介绍如何在Spring Boot中使用事务注解来管理事务。

常备不懈 1301

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

spring 七种事务传播行为

spring事务传播行为详解 一、什么是事务传播行为? 二、Spring中七种事务传播行为 三、REQUIRED,REQUIRES_NEW,NESTED异同 四、三种Transactional不回滚问题 五、异常:Transaction rolled back because it has been marked as rollback-only原因 spring事务传播行为详解 前言 Spring在TransactionDefinition接口中规定了7种类型的事务传播行为。事务传播行为是..

Boush 732

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

spring boot 线程回滚_Spring 事务笔记

Transactional注解不生效检查你方法是不是public的,不能作用在方法里的任何内部方法。数据库是否支持事务,比如mysql中innodb引擎支持事务,myisam引擎不支持事务。检查异常是否被catch了。优先级顺序为:方法>类>接口;推荐在类的实现类使用。在接口使用如果是CGLIB,根据CGLIB代理模式,接口的注解不能被继承。Spring事务4种隔离级别read-unc...

weixin_39702335的博客 603

JavaWeb后端基础(6)

我们在保存工作经历信息的时候,需要记录是哪位员工的工作经历。所以,保存完员工信息之后,是需要获取到员工的ID的,那这里就需要通过Mybatis中提供的主键返回功能来获取。

weixin_60470460的博客 1127

spring源码_Spring源码剖析9:Spring事务源码剖析

转自:http://www.linkedkeeper.com/detail/blog.action?bid=1045本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看https://github.com/h2pl/Java-Tutorial喜欢的话麻烦点下Star哈文章将同步到我的个人博客:http://www.how2playlife.com本文是微信...

weixin_39647412的博客 133

9-事务管理

事务的传播机制是指如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为。即:在执行一个@Transactinal注解标注的方法时,开启了事务;例如用户新增需要插入用户表、用户与岗位关联表、用户与角色关联表,如果插入成功,那么一起成功,如果中间有一条出现异常,那么回滚之前的所有操作, 这样可以防止出现脏数据,就可以使用事务让它实现回退。@Transactional注解只能应用到public可见度的方法上,可以被应用于接口定义和接口方法,方法会覆盖类上面声明的事务。

qwy715229258163的博客 974

2-Spring事务传播机制有哪些

如果当前存在事务, 则加入该事务. 如果当前没有事务, 则以非事务的方式继续运行.默认的事务传播级别. 如果当前存在事务, 则加入该事务. 如果当前没。强制性. 如果当前存在事务, 则加入该事务. 如果当前没有事务, 则。如果当前存在事务, 则创建一个事务作为当前事务的嵌套事务来运行.创建一个新的事务. 如果当前存在事务, 则把当前事务挂起. 也。以非事务方式运行, 如果当前存在事务, 则把当前事务挂起.以非事务方式运行, 如果当前存在事务, 则抛出异常.启自己的事务, 且开启的事务相互独立, 互不干扰.

weixin_41775999的博客 313

Spring—事务2

1. 事务传播行为 当事务方法被另一个事务方法调用时,必须制定事务应该如何传播,例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。事务的传播行为可以由传播属性指定,Spring定义了7种类传播行为 REQUIRED:如果有事务在运行,当前的方法就在这个事务内运行,否则,就启动一个新的事务,并在自己的事务内运行 REQUIRED_NEW:当前的方法必须启动新事物,...

qq_35556254的博客 421

编程随笔-SpringBoot | 08.@Transactional注解开启事务

0.参考文章 Spring事务详细解释,满满的都是干货! 看完就明白_spring事务的7种传播行为 数据库Transactional注解的用法,由问题"方法【xxxx】需要在Transactional注解指定rollbackFor或者在方法中显示的rollback"引入 1.propagation属性:事务传播行为 propagation一共有七种,都是PROPAGATION.xxx,分别是 传播行为 含义 REQUIRED 需要:方法需要在事务中进行,若不在则开启事务 S

xyx-Eshang的博客 1037

Spring的Transactional: 处理事务的强大工具

在软件开发中,事务是指由一系列操作组成的逻辑单元,这些操作要么全部成功地执行,要么全部回滚到初始状态,以保证数据的一致性和完整性。事务的使用非常重要,尤其是在处理数据库操作时。事务是数据库管理系统中的一条或者多条操作指令的集合,这些操作指令被封装为一个整体,以保证数据库的完整性、一致性和原子性。在事务中,所有操作都成功,事务才能提交,否则回滚,这样可以确保数据的一致性和完整性。事务具有以下四个特性:原子性(Atomicity):事务是一个原子操作单元,其对数据的修改要么全部执行,要么全不执行。

mikezhu的博客 311

Spring_使用spring的注解式事务管理_事务的传播行为和隔离级别

事物注解方式: @Transactional 当标于类前时, 标示类中所有方法都进行事物处理 例子: @Transactional public class TestServiceBean implements TestService {}   当类中某些方法不需要事物时: @Transactional public class TestServiceBean implements

mikyz的专栏 381

spring事务

如果使用了Transactional注解,呢么这个方法的所有sql语句都会在一个事务中执行,但是没有使用的话,sql查询就会在多个事务执行,所以即使是使用读操作,若使用多条查询语句时候,使用Transactional并指出isReadOnly 为true,便会优化执行。语句都会在一个单独的事务中进行处理,执行结束后会自动提交事务,并开启一个新的事务。嵌套式事务,也就是父子的关系,子事务提交依赖于父事务,只有父事务提交之后,子事务才会提交,同样若父事务回滚,子事务也会回滚。如果当前存在事务,则加入该事务;

m0_61844176的博客 783
上一篇: Typescript-vue3基础笔记
下一篇: 电脑组装配件知识
别浪呀
博客等级 码龄8年 1万+粉丝 260原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值