spring事物简单分析

Spring事物注解@Transactional失效场景 概述 @Transactional注解相信大家都不陌生,平时在开发中spring框架中经常用到的事物注解。 他的作用就是控制程序执行的原子性,保证程序要提交就一起提交,如果出现错误,则一起进行回滚操作。 但是在使用@Transactional注解的时候有很多需要注意的地方,不然你就会发现这个事物注解会出现失效的情况。 在spring程序中如何去管理事物 事物管理在系统开发中是不可缺少的,在spri... 阅读详情

一、数据库事物的基本特性

1、事物是区分文件存储系统与Nosql数据库重要特性之一,其存在的意义是为了保证即使在并发情况下也能正确的执行crud操作。怎样才算是正确的呢?这时提出了事物需要保证的四个特性即ACID:

A: 原子性(atomicity)

事物中各项操作,要么全做要么全不做,任何一项操作的失败都会导致整个事物的失败;

C: 一致性(consistency)

事物结束后系统状态是一致的

I:隔离性(isolation)

并发执行的事物彼此无法看到对方的中间状态;

D: 持久性(durability)

事物完成后所做的改动都会被持久化,即使发生灾难性的失败

2、在高并发的情况下,要完全保证其ACID特性是非常困难的,除非把所有的事物串行化执行,但带来的负面的影响将是性能大打折扣。很多时候我们有些业务对事物的要求是不一样的,所以数据库中设计了四种隔离级别,供用户基于业务进行选择。

脏读 :一个事物读取到另一事物未提交的更新数据

不可重复读 : 在同一事物中,多次读取同一数据返回的结果有所不同, 换句话说, 后续读取可以读到另一事物已提交的更新数据. 相反, “可重复读”在同一事物中多次读取数据时, 能够保证所读数据一样, 也就是后续读取不能读到另一事物已提交的更新数据。

幻读 :查询表中一条数据如果不存在就插入一条,并发的时候却发现,里面居然有两条相同的数据。这就幻读的问题。

小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

隔离级别

脏读(Dirty Read)

不可重复读(NonRepeatable Read)

幻读(Phantom Read)

未提交读(Read uncommitted)

可能

可能

可能

已提交读(Read committed)

不可能

可能

可能

可重复读(Repeatable read)

不可能

不可能

可能

可串行化(SERIALIZABLE)

不可能

不可能

不可能

数据库默认隔离级别:

Oracle中默认级别是 Read committed

mysql 中默认级别 Repeatable read。另外要注意的是mysql 执行一条查询语句默认是一个独立的事物,所以看上去效果跟Read committed一样。

3、spring事物的转播机制

类别

事物传播类型

说明

支持当前事物

PROPAGATION_REQUIRED

(必须的)

如果当前没有事物,就新建一个事物,如果已经存在一个事物中,加入到这个事物中。这是最常见的选择。

PROPAGATION_SUPPORTS

(支持)

支持当前事物,如果当前没有事物,就以非事物方式执行。

PROPAGATION_MANDATORY

(强制)

使用当前的事物,如果当前没有事物,就抛出异常。

不支持当前事物

PROPAGATION_REQUIRES_NEW

(隔离)

新建事物,如果当前存在事物,把当前事物挂起。

PROPAGATION_NOT_SUPPORTED

(不支持)

以非事物方式执行操作,如果当前存在事物,就把当前事物挂起。

PROPAGATION_NEVER

(强制非事物)

以非事物方式执行,如果当前存在事物,则抛出异常。

套事物

PROPAGATION_NESTED

(嵌套事物)

如果当前存在事物,则在嵌套事物内执行。如果当前没有事物,则执行与PROPAGATION_REQUIRED类似的操作。

七种事务的传播机制

事务的七种传播机制分别为:

REQUIRED(默认) 默认的事务传播机制,如果当前不支持事务,那么就创建一个新的事务。

SUPPORTS 表示支持当前的事务,如果当前没有事务,则不会单独创建事务

以上的这两种事务传播机制比较好理解,接下来的几种事务传播机制就比上边的这几类稍微复杂一些了。

REQUIRES_NEW

定义: 创建一个新事务,如果当前事务已经存在,把当前事务挂起。
为了更好的理解REQUIRES_NEW的含义,我们通过下边的这个实例来进一步理解:

有这么一个业务场景,需要往数据插入一个account账户信息,然后同时再插入一条userAccount的流水信息。(只是模拟场景,所以对象的命名有点简陋)
直接来看代码实现,内容如下所示:

@Service
public class AccountService {
    @Autowired
    private AccountDao accountDao;
    @Autowired
    private UserAccountService userAccountService;
    /**
     * 外层定义事务, userAccountService.saveOne单独定义事务
     *
     * @param accountId
     * @param money
     */
    @Transactional(propagation = Propagation.REQUIRED)
    public void saveOne(Integer accountId, Double money) {
        accountDao.insert(new Account(accountId, money));
        userAccountService.saveOne("idea", 1001);
        //这里模拟抛出异常
        int j=1/0;
    }
}
@Service
public class UserAccountService {
    @Autowired
    private UserAccountDao userAccountDao;
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void saveOne(String username,Integer accountId){
        userAccountDao.insert(new UserAccount(username,accountId));
    }
}

REQUIRES_NEW 总是新启一个事务,这个传播机制适用于不受父方法事物影响的操作,比如某些业务场景下需要记录业务日志,用于异步反查,那么不管主体业务逻辑是否完成,日志都需要记录下来,不能因为主体业务逻辑报错而丢失日志;但是本身是一个单独的事物,会受到回滚的影响,也就是说 userAccountService.saveOne里面要是抛了异常,子事务内容一起回滚。

NOT_SUPPORTED

定义:无事务执行,如果当前事务不存在,把已存在的当前事务挂起。

@Service
public class UserAccountService {
    @Autowired
    private UserAccountDao userAccountDao;
    @Transactional(propagation = Propagation.NOT_SUPPORTED)
    public void saveOne(String username,Integer accountId){
        userAccountDao.insert(new UserAccount(username,accountId));
    }
}

在执行的过程中,userAccountService.saveOne抛出了异常,但是由于该方法申明的事物传播属性为NOT_SUPPORTED级别,因此当子事务内部抛出异常的时候,子事务本身不会回滚,而且也不会影响父类事务的执行。 

NOT_SUPPORTED可以用于发送提示消息,站内信、短信、邮件提示等。不属于并且不应当影响主体业务逻辑,即使发送失败也不应该对主体业务逻辑回滚,并且执行过程中,如果父事务出现了异常,进行回滚,也不会影响子类的事务

NESTED

定义:嵌套事务,如果当前事务存在,那么在嵌套的事务中执行。如果当前事务不存在,则表现跟REQUIRED一样。

当父事务出现了异常之后,进行回滚,子事务也会被牵扯进来一起回滚。

MANDATORY

定义:MANDATORY单词中文翻译为强制,支持使用当前事务,如果当前事务不存在,则抛出Exception。

当子方法定义了事务,且事务的传播属性为MANDATORY级别的时候,如果父方法没有定义事务操作的话,就会抛出异常。(此时的子方法会将数据记录到数据库里面)

NEVER

定义:当前如果存在事务则抛出异常

在执行userAccountService.saveOne()函数的时候,发现父类的方法定义了事务,因此会抛出异常信息,并且userAccountService.saveOne()会回滚。

Spring : Spring @Transactional事物创建 1.美图 2.前文回顾 先来回顾一下事物创建的代码片段: try { boolean newSynchronization = (getTransactionSynchronization() != SYNCHRONIZATION_NEVER); // 创建DefaultTransactionStatus对象实例 DefaultTransactionStatus stat... 阅读详情

相关推荐

目标检测技术的发展:从R-CNN、YOLO到DETR、DINO

OV-DINO的出现标志着在开放域目标检测领域的重大进步,其在处理未见过的物体类别时的能力得到了显著提升。这项技术对于需要适应未知或变化环境的应用具有重要意义,如自动驾驶、机器人视觉、安防监控等。

DeepAIedu的博客 2629

更新数据库里的一条数据后,事务没提交又更新这笔数据,表中的这表数据会被锁住

在一个java函数里更新数据库一条数据后,更新没提交又更新这笔数据,表中的这表数据会被锁住。 总结并行事务第一个事务会锁住更新的记录,下一个事务操作(更新或删除)该记录时排队等待上一个事务释放锁,如果等待过长会取消操作,并且抛出异常,捕获异常进行相应的操作回滚事务或关闭连接释放锁,不然会导致死锁。并且上一个事务提交之后,下一个事务的回滚不会影响到上一个事务的操作。 ...

爱好jyh的博客 1万+

混沌系统在图像加密中的应用(二维离散Hénon混沌映射)

Hénon映射是一种二维离散时间动力系统,由美国数学家Michel Hénon在1976年引入。它是混沌动力系统中的经典模型之一,具有简单的形式和复杂的行为。

weixin_42207434的博客 2489

Spring中多个service处理同一行数据多次,出现事务互相等待超时问题,Lock wait timeout exceeded;try restarting transaction

Spring中多个service处理同一行数据多次,出现事务互相等待超时问题 遇到的问题: 某service的一个方法handleMethodA 举例子1: @Transactional(value="transManager") public void handleMethodA(){ ... @Transactional serviceB.handleMethdB();// 操作的数据表是order,同一行数据 sericeC.postMethodC(xxx);

做技术,贵在学习与坚持! 1472

嵌入式Linux Qt应用程序卡死问题分析记录

根据应用和系统层面的分析,软件功能异常和卡死现象的原因是系统控制台/dev/console阻塞导致依赖其的相关应用和命令异常。系统控制台/dev/console阻塞的原因还未确定,最近的软件版本和其他测试同事未出现该问题,所以很大可能是串口线的问题,待后续有进展了继续更新。

V10_x的博客 1642

PX4飞控与MAVROS实战:从零搭建无人机ROS通信环境(附常见报错解决)

本文详细介绍了如何从零搭建PX4飞控与ROS的通信环境,重点解析了MAVROS的安装、硬件连接、串口权限配置以及坐标系转换等核心步骤。针对GeographicLib数据下载失败、串口权限不足等常见报错提供了实用解决方案,并附有Offboard模式控制的代码示例,帮助开发者快速建立稳定的无人机ROS开发环境。

dapp9builder的博客 335

SpringBoot 多数据源及事务解决方案

1. 背景一个主库和N个应用库的数据源,并且会同时操作主库和应用库的数据,需要解决以下两个问题:如何动态管理多个数据源以及切换?如何保证多数据源场景下的数据一致性(事务)?本文主要探讨这两个问题的解决方案,希望能对读者有一定的启发。2. 数据源切换原理通过扩展Spring提供的抽象类AbstractRoutingDataSource,可以实现切换数据源。其类结构如下图所示:targetDataSo...

Java笔记虾 2089

Multisim 11.0的安装破解汉化步骤

15:打开注册机,选择管理员运行,默认第一项,选择生成文件路径,这里不要随意选择,要找到你安装Multisim安装路径下Shard下的License Manager路径下,否则会报错,破解失败。14:后面会出现一个更新提示,选择否,然后选择重启电脑后,先不要选择重启电脑,在这里出现了问题(可能敲击回车,默认去重启电脑了),所以我说不要重启电脑,重启破解时右下角出现这,点击否。17:重启电脑,如果前面重启过,那可以跳过重启,应用程序下找到下图所示,启动。16:点击确认覆盖,路径下生成了该文件。

qq_53260940的博客 2371

Spring Boot 各种事务操作实战(自动回滚、手动回滚、部分回滚)

事务,就是一组操作数据库的动作集合。事务是现代数据库理论中的核心概念之一。如果一组处理步骤或者全部发生或者一步也不执行,我们称该组处理步骤为一个事务。当所有的步骤像一个操作一样被完整地执行,我们称该事务被提交。由于其中的一部分或多步执行失败,导致没有步骤被提交,则事务必须回滚到最初的系统状态。

LoveSummer 2万+

使用IntelliJ IDEA配置版本管理(SVN和Git)

在开发过程中,版本管理是必不可少的一部分,它可以帮助团队协作、管理代码历史记录,并且提供了代码回滚和分支管理等功能。本文将介绍如何使用IntelliJ IDEA配置版本管理,包括SVN和Git两种方式,另外列举了常见的问题并指导修复,以帮助开发者更高效地进行代码管理和协作。

2870

高通410随身WiFi刷OpenWRT与Debian双系统一键集成方案

本文详细介绍高通410随身WiFi设备刷入OpenWRT与Debian双系统的一键集成方案。通过虎王工作室提供的一键刷机包,用户可轻松实现双系统部署,兼顾OpenWRT的网络功能与Debian的完整应用服务,适用于网络加速、服务器部署等多种场景,并提供了硬件资源分配与系统切换的实用指南。

docker7nomad的博客 1137

数据库事务

数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。——百度、维基百科百科 一个数据库事务通常包含了一个序列的对数据库的读/写操作。它的存在包含有以下两个目的: 为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。 当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,...

qq_34819372的博客 271

AI工具 | 每个打工人必备的15款人工智能超级工具

不过,还是有一些靠谱的人工智能平台,它们可不只是营销噱头。有些AI公司正试图改变游戏规则。人工智能工具让人们能够更聪明地工作,而不是更辛苦地劳作。如果你想知道未来有什么,那就来看看这10款人工智能工具吧,它们将彻底改变我们的工作方式。

Vampire_2017的博客 5万+

Spring事件机制详解

一、前言 说来惭愧,对应Spring事件机制之前只知道实现 ApplicationListener 接口,就可以基于Spring自带的事件做一些事情(如ContextRefreshedEvent),但是最近看公司的wiki基于Spring事件的领域驱动才发现原来还有这么多东西。 二、订阅/发布(观察者模式) 2.1简介 Spring是基于事件驱动模型的,...

weixin_30536513的博客 99

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Spring事物

Spring事物基础概念

cqq00的博客 681

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

对于Spring事物的理解

对于Spring中的transaction的一些理解

EDG_Clearlove_7的博客 286

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Spring源码分析 事物

Spring源码分析事物 Spring事物 源头如下 public class TransactionInterceptor extends TransactionAspectSupport implements MethodInterceptor, Serializable { } TransactionInterceptor 事物拦截器。当想要调用目标方法时(如操作数据层),会先转换为代理对象...

zahary 214

spring的事物

不知道为啥,重新写了一遍声明式事物,就可以使用了,原来的报错找不到Bean。事物处理后,对数据的修改是永久的,一旦执行事物成功,就刷新到数据库。使用这种方式的前提是,已经集成了spring-mybatis。这是我第三次接触事物了,mysql一次,以前的也看过一次。所以,我们开启事物,就是为了利用上面的四个特点,解决问题。在事物的开启和结束,数据库的完整性不被破坏。多线程时,要保证数据的安全,也就是并发安全。至于集成mybatis的代码,在前面写过博客。多条sql保证同时成功,同时失败。打代码还是太马虎了。

qx020814的博客 1980

Spring事物管理

事物可以看做是由对数据库的若干操作组成的一个单元事物是一系列的动作,一旦其中有一个动作出现错误,必须全部回滚,提供将事物中对数据库的所有已完成的操作全部撤销,滚回到事物开始的状态,避免出现由于数据不一致而导致接下来的一系列错误.事物的出现是为了确保数据的完整性和一致性,确保用户的每一个操作都是可靠的,事物中的每一步操作都必须执行,只要有发生异常就回退到事物未开始的操作状态,这些事物要么都执行,要么都取消,从而保证数据满足原子性,一致性.在目前的企业开发中,事物的管理是必不可少的.

weixin_52629592的博客 546

Spring事物05-源码分析TransactionStatus

文章目录Spring事物源码分析-TransactionStatus一、TransactionStatus接口二、DefaultTransactionStatus(实现类)三、TransactionStatus和PlatformTransactionManager四、TransactionStatus和事物操作五、小结 Spring事物源码分析-TransactionStatus 一、Transa...

my_momo_csdn的博客 8828

Spring 使用注解方式进行事物管理

Spring 使用注解方式进行事物管理大家在使用spring的注解式事务管理时,对事务的传播行为和隔离级别可能有点不知所措,下边就详细的介绍下以备方便查阅。事物注解方式: @Transactional当标于类前时, 标示类中所有方法都进行事物处理例子:@Transactional public class TestServiceBean implements TestService {}当类中某些方

张勤一 1129

spring-事物源码分析

spring-事物源码分析 1.spring事物管理的实现原理 2.spring是如何控制事物的提交与回滚的?try/catch 2.spring事物管理的传播属性 3.事物的总结   spring事物管理的实现原理 猜想+验证 源码分析: org.springframework.transaction.interceptor.TransactionAspectSupport....

wflovejava的博客 292

Spring的事物管理

本文介绍了Spring对事物管理的两种方式,即编程式事物和声明式事物。 一.认识事物 事物是以可控制的方式限定程序对数据资源进行访问的一组操作;它的目的是为了保证程序运行中数据资源的正确性和完整性,为了达到这个目的,事物拥有以下四个属性: 1.原子性:原子性要求事物所包含的这一组操作是一个不可分割的整体,要么这组操作全部成功,要么其中一个失败,即整个事物失败; 2.一致性:一致性要求事

wj481199的专栏 540

Spring事物03-源码分析TransactionInterceptor

文章目录Spring事物源码分析-TransactionInterceptor一、TransactionInterceptor二、主体方法分析2.1 invoke2.2 invokeWithinTransaction主体方法2.3 主体方法分析三、步骤分析3.1 createTransactionIfNecessary3.1.1 getTransaction3.1.1.1 doGetTransac...

my_momo_csdn的博客 976

spring事物源码分析

今天的任务是剖析源码,看看Spring 是怎么运行事务的,并且是基于当前最流行的SpringBoot。

clz1314521的专栏 492

Spring基础篇-事物(声明式事物与编程式事务)!

getTransaction(@Nullable TransactionDefinition definition) 根据传入的definition,获取一个事物对象,在这里面,它定义了一些事物的基本规则,如传播性,隔离级别等。例如,你使用了jdbc,则可以使用DataSourceTransactionManager作为事物的管理器,如果使用的是Hibernate,则可以使用HibernateTransactionManager作为事物的管理器!

H935961611的博客 369
上一篇: linux 下redis的安装
下一篇: 多线程排查死锁的命令
RunnerSlowly
博客等级 码龄12年 1粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值