事务

事务、隔离级别和并发一致性问题 前言 大家好,我是fancy呀。 数据库的事务一直以来是数据库最核心的基础知识,熟悉事务知识是深入学习数据库的前提;同时,数据库的事务也是互联网面试最最最常问的知识之一。 本文我们将从以下几个角度深入分析: 事务的四大特性->数据库并发环境下的一致性问题->数据库的隔离级别分别所解决的一致性问题。 话不多说,小伙伴们,上车吧🚙! 事务 什么是事务? 事务是数据库系统里面非常重要的术语。它可以由一行简单的SQL来实现,也可以由一组复杂的SQL来实现。对于MySQL来说,有两种事务实 阅读详情

1.什么是事务?

  事物指的是逻辑上的一组操作,这组操作要么全部成功,要么全部失败。

2.事务的特性:

 原子性、一致性、隔离性、持久性。

  原子性:是指事物是一个不可分割的工作单元,事务中的操作要么都发生,要么都不发生。

  一致性:是指事务前后数据的完整性必须保持一致,即数据总和是一致的(比如张三有两千元,李四有两千元 张三转账给李四一千元,这时张三有一千元,李四有三千元,这样数据发生事务前后总数不变)

隔离性:指多个任务并发访问数据库时,一个用户的事务不能被其他用户的事务所干扰,多个并发事务之间数据要相互隔离。

如上图所示张三通过事务一修改了一条记录,修改过程中,事务二也修改了同一条记录;这样会出现数据被重新修改,或者修改的记录被覆盖,解决着这种情况可以通过事务的隔离级别来避免这种情况的发生。

持久性:一个事务一旦提交,他对数据库数据库中数据的改变就是永久的,即使数据库发生故障也不应该对其有任何影响。

3.如果不考虑事务隔离性,会引发安全问题如下:

脏读:一个事务读取到了另一个事务改写但还没提交的数据,而导致了查询结果不一致的问题;如果这些数据被回滚,则读到的数据是无效的;事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据。

不可重复读:在同一事务中读到了另一事务已经提交的更新的数据,多次读取同一数据返回的结果不同(另一事务提交前和提交后的数据不同);事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。

幻读(虚读):一个事务读取了几条记录后,另一事务插入了一些记录,幻读就发生了。再后来的查询中,第一个事务就会发现有一些原来没有的记录;系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

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

事务隔离级别脏读不可重复读幻读
读未提交(read-uncommitted)是是是
不可重复读(read-committed)否是是
可重复读(repeatable-read)否否是
串行化(serializable)否否否

mysql默认的事务隔离级别为repeatable-read

4、用例子说明各个隔离级别的情况

 

1、读未提交:

    (1)打开一个客户端A,并设置当前事务模式为read uncommitted(未提交读),查询表account的初始值:

(2)在客户端A的事务提交之前,打开另一个客户端B,更新表account:

(3)这时,虽然客户端B的事务还没提交,但是客户端A就可以查询到B已经更新的数据:

(4)一旦客户端B的事务因为某种原因回滚,所有的操作都将会被撤销,那客户端A查询到的数据其实就是脏数据:

 (5)在客户端A执行更新语句update account set balance = balance - 50 where id =1,lilei的balance没有变成350,居然是400,是不是很奇怪,数据不一致啊,如果你这么想就太天真 了,在应用程序中,我们会用400-50=350,并不知道其他会话回滚了,要想解决这个问题可以采用读已提交的隔离级别

4.串行化

(1)打开一个客户端A,并设置当前事务模式为serializable,查询表account的初始值:

mysql> set session transaction isolation level serializable;
Query OK, 0 rows affected (0.00 sec)

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from account;
+------+--------+---------+
| id   | name   | balance |
+------+--------+---------+
|    1 | lilei  |   10000 |
|    2 | hanmei |   10000 |
|    3 | lucy   |   10000 |
|    4 | lily   |   10000 |
+------+--------+---------+
rows in set (0.00 sec)

(2)打开一个客户端B,并设置当前事务模式为serializable,插入一条记录报错,表被锁了插入失败,mysql中事务隔离级别为serializable时会锁表,因此不会出现幻读的情况,这种隔离级别并发性极低,开发中很少会用到。

mysql> set session transaction isolation level serializable;
Query OK, 0 rows affected (0.00 sec)

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into account values(5,'tom',0);
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

什么是事务,以及事务的特性! 阅读详情

相关推荐

Spring 事务和事务传播机制

Spring 事务和事务传播机制

qq_63983125的博客 3371

数据库基础系列之【事务与并发一致性问题】

事务 概念 事务指的是一组操作的集合,事务的产生,其实是为了当应用程序访问数据库的时候,简化我们的编程模型,不需要我们去考虑各种各样的潜在错误和并发问题 当我们使用事务时,要么提交,要么回滚,我们不会去考虑网络异常了,服务器宕机了,同时更改一个数据怎么去处理它 特性 事务操作的正确性,通过以下几个特性来保障 特性 描述 原子性 事务不可再分,要么全提交,要么全回滚 隔离性 两个事务操作的结果在未提交前互相不可见 持久性 即使发生故障导致数据

存星的博客 543

深入剖析Mysql事务和Spring事务

本文分享一些关于Mysql如何解决多事务并发的问题和Spring源码是怎么控制事务以及一些事务失效的场景。 分享内容 Mysql事务隔离机制 锁机制 MVCC多版本并发控制隔离机制 Spring事务应用和源码分析 事务失效问题 一、Mysql事务 数据库的多事务并发问题,为了解决多事务并发问题,数据库设计了事务隔离机制、锁机制、MVCC多版本并发控制隔离机制,用一整套机制来解决多事务并发问题。 1.1事务的属性 事务(Transaction)是数据库系统中一系列操作的一个逻辑单元,所有操作要么全部成功要

weixin_57907028的博客 1279

面试官:聊一下分布式事务!

你知道的越多,不知道的就越多,业余的像一棵小草!你来,我们一起精进!你不来,我和你的竞争对手一起精进!编辑:业余草推荐:https://www.xttblog.com/?p=5160概要在...

xmt1139057136的专栏 2万+

从科研小白到动物行为分析:我的DeepLabCut 3.0安装与初体验全记录

本文记录了从科研小白到成功安装并使用DeepLabCut 3.0进行动物行为分析的全过程。详细介绍了Anaconda环境配置、CUDA版本选择、DeepLabCut安装步骤及验证方法,并分享了初体验中的实用技巧和跨学科研究心得,为生物研究者提供了AI工具应用的实战指南。

weixin_30235225的博客 403

NRF52832串口通信避坑指南:从SDK配置到硬件流控(RTS/CTS)实战

本文详细介绍了NRF52832串口通信的实战指南,从SDK配置到硬件流控(RTS/CTS)的完整实现。通过分析UARTE模块特性、解决SDK版本差异问题、正确配置硬件引脚以及实现稳定通信的代码示例,帮助开发者避开常见陷阱,确保高效可靠的串口通信。特别强调了硬件流控在高速通信中的重要性及其实践方法。

weixin_33739646的博客 283

事务ACID理解

事务管理(ACID) 谈到事务一般都是以下四点 原子性(Atomicity) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 一致性(Consistency) 事务前后数据的完整性必须保持一致。 隔离性(Isolation) 事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。 持久性(Durability) 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障

Dream_6666的博客 216

KUKA机器人与S7-1200 PLC实现Profinet通讯配置步骤详解

在工业自动化产线中,PLC与工业机器人之间的高效数据交换是控制逻辑落地的关键。传统硬接线方案在信号点多时布线复杂、故障排查困难,而现场总线技术通过一根网线即可实现主从设备间的周期通讯。Profinet作为主流工业以太网协议,由S7-1200作为IO Controller主站,KUKA机器人作为IO Device从站,在WorkVisual与TIA Portal中完成设备组态、I/O映射及信号分配,即可替代成捆电缆,稳定传输启停、状态及报警信号。这一方案适用于汽车、3C、物流等行业的自动化产线,尤其适合需要扩

weixin_42519985的博客 251

事务四大特性(ACID)

简单阐述事务的四大特性(原子性、一致性、隔离性和持久性),和解释并发事务的相互影响(脏读、不可重复读、幻读,第一类丢失更新和第二类丢失更新),并举出详细例子。

qq_42313904的博客 1313

从0到1带大家搭建spring cloud alibaba 微服务大型应用框架(十一)spring-boot-admin 监控篇(2)springcloud 集成spring boot admin

从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(十一)spring-boot-admin 监控篇(2)springcloud 集成spring boot admin spring-boot-admin 服务端创建与集成入nacos spring-boot-admin 查看日志

峡谷电光马仔的博客 1386

AUTOSAR进阶图解==>AUTOSAR_EXP_VFB

AUTOSAR虚拟功能总线(VFB)摘要 AUTOSAR虚拟功能总线(VFB)是汽车开放系统架构中的核心抽象概念,为分布式电子系统提供统一通信模型。VFB允许软件组件在不了解底层物理通信机制的情况下交互,通过运行时环境(RTE)实现组件间的数据交换。系统配置过程将抽象的VFB视图转换为具体实现,包括组件到ECU的映射和通信机制选择。VFB采用"last-is-best"语义进行数据通信,并支持模式管理机制,使组件能根据系统状态调整行为。此外,VFB还支持与非AUTOSAR系统的交互,通常

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 1118

Spring事务和MySQL事务详解

文章目录数据库事务事务是什么事务的四大特性MySQL事务隔离级别查看MySQL当前事务隔离级别MySQL默认操作模式为自动提交模式JDBC处理事务Spring事务Spring的事务传播PROPAGATION_REQUIREDPROPAGATION_SUPPORTSPROPAGATION_MANDATORYPROPAGATION_REQUIRES_NEWPROPAGATION_NOT_SUPPORT...

Keep Moving 5万+

Android/Linux驱动开发:使用dev_dbg进行设备驱动调试

在本文中,我们将介绍如何使用dev_dbg宏和相关的函数来进行设备驱动调试。函数在该目录下创建了一个名为"debug"的debugfs文件。在这些函数中,您可以执行与您的设备驱动相关的调试操作。函数在该目录下创建了一个名为"debug"的debugfs文件。在这些函数中,您可以执行与您的设备驱动相关的调试操作。的结构体指针,其中包含了我们定义的文件操作函数。的结构体指针,其中包含了我们定义的文件操作函数。在上面的示例中,我们首先通过调用。在上面的示例中,我们定义了。在上面的示例中,我们定义了。

ByteKnight的博客 375

Spring事务——查看事务id

今天同事遇到一个问题:在使用Spring的事务管理时,开启了一个事务,接着在内部开启了两个传播模式为嵌入(PROPAGATION_NESTED)的事务,想看下这三个事务的id是否一致,但是查了半天也没查到Spring怎么获取事务id。 这里提供两个思路,不知到对不对。 1 使用MySQL的事务id 既然Spring的事务最终还是要看MySQL,那我们不如直接去MySQL里查询事务id: ...

java开发学习积累 1万+

小龙虾OpenClaw卸载全攻略,彻底清理缓存和配置,干净无残留!

不想要的小龙虾OpenClaw怎么彻底卸载?🦞本文教你如何彻底的卸载OpenClaw⚡️,Windows/macOS/Linux通用,干净无残留🧹

XiaoqiangClub的博客 316

Python调用CANoe(1)(启动与停止,变量和信号读写)

CANoe因为其封闭性(Vector独有),开发的时候,有很多局限性;Python 因为其开源,容易上手,功能强大,那么Python 和 CANoe结合会产生怎样的火花呢?

蚂蚁小兵 4万+

Spring事务、事务隔离级别、事务传播机制

Spring事务、事务隔离级别、事务传播机制

yyhgo_的博客 2218

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

java事务 深入Java事务的原理与应用

java事务 深入Java事务的原理与应用 一、什么是JAVA事务     通常的观念认为,事务仅与数据库相关。     事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性 (isolation)和持久性(durability)的缩写。事务的原子性表示事务执行过程中的任何失败都将导致事务所做的任何

sinat_33536912的博客 3万+

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

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

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

本地事务、全局事务、分布式事务

举个例子,假设你的代码调用了 JDBC 中的。

凄戚的博客 1525

[事务] 事务的回滚机制

一、事务管理的意义: 在service类或所有service方法都加上事务操作;用来保证一致性,即service方法里的多个dao操作,要么同时成功,要么同时失败,保证了事务的原子性 二、springboot配置事务管理的步骤 1、导入相关依赖 数据源、数据库、SpringJdbc模块 <dependency> <groupId>org.springframework</groupId> &l.

GSON的博客 1万+

【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)

本文用实际的SQL演示了事务的三大并发事务问题,还详细介绍了事务操作、事务四大特性和事务隔离级别。

实用技术干货分享⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄对您有用的话请点个关注吧~ 961

mysql 事务 及 Spring事务 初论

mysql事务 和 spring 事务

huangchong0107的博客 1373

【Spring事务实用版】事务实现 && 事务失效 && 事务传播机制

是通过配置和注解的方式,无需手动编写事务控制代码,实现对事务的管理。幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体。是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。将需要事务管理的方法提取到另一个类中,通过外部调用方法,确保调用经过代理,这样事务就会生效。是指在一个事务处理过程里读取了另一个未提交的事务中的数据。(读取未提交的数据)

学不会就接着学 1322

JAVA 事务之JDBC事务、JTA事务和容器事务

一、什么是Java事务 事务是一组原子操作单元 从数据库角度说,就是一组SQL指令,要么全部执行成功,若因为某个原因其中一条指令执行有错误,则撤销先前执行过的所有指令更简答的说就是:要么全部执行成功,要么撤销不执行。事务必须服从ISO/IEC所制定的ACID原则。 原子性(atomicity) 一致性(consistency) 隔离性(isolation) 持久性(durability) 原子性

Heqianqian的博客 2136

SpringBoot 事务深度解析【事务传播、事务的隔离性、事务的回滚、事务的嵌套,事务同步,事务日志记录】【程序员猫爪】

事务传播行为定义了多个包含事务的方法在相互调用时,事务是如何在这些方法间进行传播的。例如,一个方法调用另一个带有事务的方法时,新方法是沿用调用者的事务,还是开启新的事务,亦或是不使用事务等情况,Spring 提供了多种事务传播行为的选项来应对不同的业务场景需求。Spring 中常用的事务传播行为有以下几种(定义在REQUIRED(默认值):如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式执行方法。

程序员猫爪 1271
上一篇: web项目没有main方法,怎么运行的?
下一篇: 请求合并
一切还来得及
博客等级 码龄11年 50粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值