MySQL数据库——事务

【数据库】MySQL-基础篇-事务 一、事务简介 二、事务操作 1.未控制事务 1.1测试正常情况 1.2测试异常情况 2.控制事务一 1.1查看/设置事务提交方式 1.2提交事务 1.3回滚事务 3.控制事务二 1.1开启事务 1.2提交事务 1.3回滚事务 三、事务四大特性 四、并发事务问题 1.赃读 2.不可重复读 3.幻读 五、事务隔离级别 阅读详情

有错误的地方,欢迎大家评论留言指正!

一、事务的定义:

  1. 数据库事务可以包含一个或多个数据库操作,但这些操作构成一个逻辑上的整体。
  2. 构成逻辑整体的这些数据库操作,要么全部执行成功,要么全部不执行。
  3. 构成事务的所有操作,要么全都对数据库产生影响,要么全都不产生影响,即不管事务是否执行成功,数据库总能保持一致性状态。
  4. 以上即使在数据库出现故障以及并发事务存在的情况下依然成立。

二、事务的特征(ACID保证最终一致性):

  1. 原子性(Atomicity):事务是最小的执行单位,不允许分割。 整个事务中的所有操作要么全部提交成功,要么全部失败回滚;例如转账的这两个关键操作(将张三的余额减少200元,将李四的余额增加200元)要么全部完成,要么全部失败。undolog 保证原子性。
  2. 一致性(Consistency): 事务执行前后,数据库的状态应保持一致性。 确保从一个正确的状态转换到另外一个正确的状态,这就是一致性。例如转账业务中,将张三的余额减少200元,中间发生断电情况,李四的余额没有增加200元,这个就是不正确的状态,违反一致性。又比如表更新事务,一部分数据更新了,但一部分数据没有更新,这也是违反一致性的;
  3. 隔离性(Isolation):并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的。 锁和 MVCC 保证隔离性。
  4. 持久性(Durability):一个事务被提交之后,对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。 redolog 保证持久性。

三、事务之间的相互影响:

  1. 脏读(Dirty Read):
    指一个事务读取了另一个事务未提交的数据。
    当事务T1正在访问字段 A 并且对进行了修改,而这种修改还没有提交到数据库中。这时另外一个事务 T2 也访问和使用字段 A,但由于事务 T1 修改字段 A 后还没有提交 COMMIT,而那么事务 T2 读到的字段 A 是“脏数据”。
  2. 第一类丢失更新:(脏写)
    撤销一个事务的时候,把其它事务已提交的更新数据覆盖了。
    这是完全没有事务隔离级别造成的。如果事务1被提交,另一个事务被撤销,那么会连同事务1所做的更新也被撤销。
  3. 第二类丢失更新:
    当两个或多个事务查询相同的记录,然后各自基于查询的结果更新记录时会造成第二类丢失更新问题。
    每个事务不知道其它事务的存在,最后一个事务对记录所做的更改将覆盖其它事务之前对该记录所做的更改。通过读加锁(for update)或者版本号解决。
  4. 不可重复读:(MySql默认隔离级别)
    不可重复读取是指同一个事务在整个事务过程中对同一笔数据进行读取,每次读取结果都不同。
    如果事务1在事务2的更新操作之前读取一次数据,在事务2的更新操作之后再读取同一笔数据一次,两次结果是不同的。原因就是事务并发修改记录,要避免这种情况,最简单的方法就是对要修改的记录加锁,这回导致锁竞争加剧,影响性能。
  5. 幻读:
    指事务读取某个范围的数据时,因为其他事务的操作导致前后两次读取的结果不一致。
    事务A新增了一条记录,事务B在事务A提交前后各执行了一次查询操作,发现后一次比前一次多了一条记录,就好像发生了幻觉一样。

不可重复读重点在于update和delete,而幻读的重点在于insert。避免不可重复读需要锁行(某一行在select操作时,不允许update与delete)就行,避免幻读则需要锁表或间隙锁。

四、事务隔离级别:

在MySQL数据库中,支持下面四种隔离级别,默认的为Repeatable read (可重复读) ;而在 Oracle数据库 中,只支持Serializable (串行化) 级别和 Read committed (读已提交) 这两种级别,其中默认的为 Read committed(读已提交) 级别。
在这里插入图片描述

  • 读未提交:
    在读未提交级别,事务中的修改,即使没有提交,对其他事务也都是可见的。事务可以读取未提交的数据,这也被称为脏读 。

  • 读已提交(原理):

    • 当前读(一致性锁定读):(就是给行记录加 X 锁)(默认)
      • 如果是当前读,会对读取的记录加共享锁或排它锁,保证事务之间的隔离性。但是会出现幻读。
      • 加锁情况:事务对当前被读取的数据加 行级共享锁(当读到时才加锁),一旦读完该行,立即释放该行级共享锁;事务在更新某数据的瞬间(就是发生更新的瞬间),必须先对其加 行级排他锁,直到事务结束才释放。
    • 快照读(一致性非锁定读、MVCC):(就是单纯的 SELECT 语句)
      • 读取的是数据的可见版本;如果读取的行正在执行 DELETE 或 UPDATE 操作(即读取的记录已被其它事务加上 X 锁),这时读取操作不是去等待行上锁的释放。而是读取行的一个快照数据。
      • RC 隔离级别每次 select 查询前都生成一个Read View (m_ids 列表);所以读取的是已提交的最新版本数据;
  • 可重复读(原理):

    • 当前读(一致性锁定读):(就是给行记录加 X 锁或 S 锁)

      • 如果是当前读,会对读取的记录使用 Next-key Lock 临键锁来防止幻读。
        如果两次查询中间有其它事务插入数据,就会产生幻读。所以,会对读取的记录使用 Next-key Lock 临键锁,来防止其他事务在间隙间插入数据。
      • 加锁情况:事务在读取某数据的瞬间(就是开始读取的瞬间),必须先对其加行级共享锁,直到事务结束才释放;事务在更新某数据的瞬间(就是发生更新的瞬间),必须先对其加 行级排他锁,直到事务结束才释放。
    • 快照读(一致性非锁定读、MVCC):(就是单纯的 SELECT 语句)(默认)

      • 和 RC 一样,读取的是数据的可见版本;如果读取的行正在执行 DELETE 或 UPDATE 操作(即读取的记录已被其它事务加上 X 锁),这时读取操作不是去等待行上锁的释放。而是读取行的一个快照数据。
      • RR 隔离级别只会在事务开启后的第一次查询生成 Read View ,并使用至事务提交。
      • 防止了可重复读和防止快照读下的 “幻读”(部分幻读)。
    • SELECT语句时,可以指定当前读方式。(非单纯的 SELECT)例如:

      • SELECT … FOR SHARE / LOCK IN SHARE MODE:当前读方式,对记录加 S 锁,其它事务也可以加S锁,如果加 x 锁则会被阻塞。
      • SELECT … FOR UPDATE / insert、update、delete:当前读方式,对记录加 X 锁,且其它事务不能加任何锁。
  • 串行化:
    以锁表的方式(类似于Java多线程中的锁)使得其他的线程只能在锁外等待

五、并发事务的控制方式有哪些?

(MySQL 的隔离级别是基于锁实现的吗?)

MySQL 中并发事务的控制方式无非就两种:锁 和 MVCC。锁是悲观控制的模式,多版本并发控制是乐观控制的模式。

  • 锁:
    • 串行化隔离级别是通过锁来实现的,读已提交和可重复读隔离级别是基于 MVCC 实现的。不过,串行化之外的其他隔离级别可能也需要用到锁机制,就比如可重复读在当前读情况下需要使用加锁读来保证不会出现幻读。
  • MVCC:
    • MVCC 是多版本并发控制方法,通过创建数据的多个版本和使用快照读取来实现并发控制。读操作使用旧版本数据的快照,写操作创建新版本,并确保原始版本仍然可用。 这样,不同的事务可以在一定程度上并发执行,而不会相互干扰,从而提高了数据库的并发性能和数据一致性。

六、事务处理

  • 不能回退 SELECT 语句,回退 SELECT 语句也没意义;也不能回退 CREATE 和 DROP 语句。
  • MySQL 默认是隐式提交:
    • 每执行一条语句就把这条语句当成一个事务然后进行提交。当出现 START TRANSACTION 语句时,会关闭隐式提交;当 COMMIT 或 ROLLBACK 语句执行后,事务会自动关闭,重新恢复隐式提交。
    • 通过 set autocommit=0 可以取消自动提交,直到 set autocommit=1 才会提交;autocommit 标记是针对每个连接而不是针对服务器的。
  • 事务指令:
    • START TRANSACTION - 指令用于标记事务的起始点。
    • SAVEPOINT - 指令用于创建保留点。
    • ROLLBACK TO - 指令用于回滚到指定的保留点;如果没有设置保留点,则回退到 START TRANSACTION 语句处。
    • COMMIT - 提交事务。

参考:
原文连接:https://blog.youkuaiyun.com/qq_41116027/article/details/124135831
原文连接:https://blog.youkuaiyun.com/listeningsea/article/details/118407983
原文连接:https://javaguide.cn/database/mysql/mysql-questions-01.html
原文连接:https://javaguide.cn/database/sql/sql-syntax-summary.html

ui(new Ui::MainWindow)的解析 Ui命名空间的变量名,和默认空间的变量名虽然一样,但实际是两个不同的东西。所以构造函数中调用MainWindow是没问题的,因为它不是在调用自身,而是在调用其他命名空间下的另一个同名的MainWindow类。这里使用C++的成员初始化列表语法,初始化成员变量指针ui,可这里有个问题,在MainWindow的构造函数中new 一个MainWindow,这又调用一下MainWindow的构造函数,这岂不是会死循环?ui_mainwindow.h文件。mainwindow.h文件. 阅读详情

相关推荐

添加odbc数据源时的一些问题和解决办法

pl/sql

Mr_Syh的博客 9644

数据库事务

数据库事务是指数据库管理系统中的一个逻辑单位,由一个或多个数据库操作组成,这些操作要么全部执行成功,要么全部失败回滚。事务可以确保数据库的完整性和一致性,并支持并发访问控制。

qq_45939907的博客 608

AR1020触摸控制器驱动开发:嵌入式I²C/SPI底层集成指南

电容式触摸控制器是现代嵌入式人机交互(HMI)系统的核心感知单元,其工作原理基于寄生电容变化检测与数字信号处理。Microchip AR1020 作为典型单芯片方案,内置硬件滤波、多点跟踪与手势识别引擎,通过I²C或SPI接口输出结构化事件数据,显著降低主控MCU负载。该类器件的技术价值在于平衡精度、功耗与实时性,广泛应用于工业HMI、医疗设备及车载终端等对可靠性要求严苛的场景。本文聚焦AR1020的寄存器映射、中断驱动模型、坐标解析机制及在STM32平台的HAL/LL级工程实现,涵盖硬件时序约束、固件配置

weixin_29323977的博客 600

数据库事务的概念及其实现原理

目录 前言 1. 认识事务 1.1 为什么需要数据库事务 1.2 什么是数据库事务 1.3 事务如何解决问题 1.4 事务的ACID特性以及实现原理概述 2.并发异常与并发控制技术 2.1 常见的并发异常 ...

dcnmm48064的专栏 721

LSTM 怎么进行二维数据的输入呢

尽管LSTM并不天然地适用于处理图像、视频等二维数据,但通过时间序列化、卷积特征提取和双向LSTM等方法,我们可以将二维数据转化为适合LSTM输入的形式,从而利用LSTM的强大记忆能力和长期依赖学习能力对二维数据进行建模。未来的研究方向可以考虑将LSTM与其他模型结合,例如将LSTM与卷积神经网络(Convolutional Neural Network, CNN)结合,利用CNN提取图像的空间特征,然后利用LSTM学习时间序列的长期依赖;

xiamu_CDA的博客 1037

采购订单定价策略 超详细

‘需求’字段里填写的是一个例程编号(例程是一段判断程序),如果我们在需求中维护了例程编号,那只有这个例程条件被满足时,这个条件表才会被系统自动读取。一部分的条件表只有在凭证项目满足一定的条件时才会被读取。 ‘排斥的’字段如果别勾中的话,那表明如果这个条件表被系统成功读取到数据后,系统将停止这个存取顺序的执行,否则,系统将继续执行下去。 注意:a、如果我们给某个条件类型设定了有效期的话,那我们必须给这个条件类型分配一个存取顺序。 b、不能给一个抬头条件分配存取顺序。 是...

竹大的博客 1万+

golang mysql对比db+事务tx

事务 事务处理是数据的重要特性,对于一些支付系统,事务对业务逻辑会有重要影响。golang的mysql驱动也封装好了事务相关的操作,一般使用的是db对象的方法,事务则是使用另外一个对象,sql.Tx对象。 使用db的Begin方法可以创建tx对象,用法和db的相关用法类似。一旦创建了tx对象,事务处理都依赖与tx对象,这个对象会从连接池中取出一个空闲的连接,接下来的sql执行都基于这个连接,直到commit或者rollback调用之后,才会把连接释放到连接池。 在事务处理的时候,不能使用db的查询方法,虽然

bobi的博客 1320

ETAP实战:如何用仿真软件快速绘制标准一次接线图(附模板下载)

本文提供了一套基于ETAP软件高效绘制标准一次接线图的完整实战工作流。从国标符号库配置、绘图模板创建,到核心设备绘制、参数标注,再到利用软件模型进行拓扑检查与短路电流校核,手把手教你实现从零到一的专业图纸设计。文末附有实用模板下载,助你大幅提升电力设计效率与图纸质量。

weixin_29291573的博客 510

Go语言实现MySQL数据库事务教程

通过以上步骤,我们成功地在Go语言中实现了MySQL数据库事务。需要注意的是,在实际应用中,可能需要根据具体需求对事务进行更复杂的处理,如异常处理、回滚策略等。下面是一个简单的教程,演示如何在Go语言中实现MySQL数据库事务。方法,我们可以开启一个新的数据库事务。如果出现错误,我们使用。如果提交过程中出现错误,我们同样使用。如果有任何问题,请随时提问。在Go语言中实现MySQL数据库事务可以通过使用。如果出现错误,我们使用。方法来预编译SQL语句,并通过。在上述代码中,我们使用。在以上代码中,我们使用。

高性价比服务器就选:蓝易云 265

别再手动拷贝文件了!用Keil MDK的Pack Installer一键搞定STM32上的RT-Thread Nano移植

本文详细介绍了如何使用Keil MDK的Pack Installer一键快速移植RT-Thread Nano到STM32项目,告别繁琐的手动拷贝和配置过程。通过自动化版本管理和依赖处理,移植时间从47分钟缩短至3分钟,大幅提升开发效率。文章还提供了实战步骤、高级配置技巧和常见问题解决方案,帮助开发者轻松实现RTOS集成。

weixin_29194817的博客 363

LVGL 9Text Area 控件 (lv_textarea) 使用指南

是一个可编辑的文本输入控件,通常用于在用户界面中输入和编辑多行或单行文本。该控件支持文本插入、删除、光标控制、文本选择、密码输入等功能。它的文本内容可以通过键盘、API 或事件进行修改,还可以设置最大文本长度、占位符文本和密码模式等。是一个强大且灵活的文本输入控件,适用于多种用户输入场景,支持文本插入、删除、光标控制、密码输入等功能。通过 LittlevGL 提供的丰富 API,开发者可以自定义文本区域的外观和行为,实现复杂的文本输入需求。

m0_62599305的博客 1674

MySQL数据库的事务

比如小张向小王借500块钱,这个一系列操作就可以当作一个事务,我们可以分为两个操作,1是小张的账户 -500,2是小王的账户+500,但是如果要是我们的数据库出现异常了,小张的账户-500了,但是小王的账户没有+500,那么这个操作就十分危险了。当我加了写加锁时(具体就是我写的时候,舍友不能看,等我写完了之后再给他看),当我给舍友把在线文档发过去的时候,舍友正在读的时候,我又觉得有一个题有问题去修改了一下在线文档,导致舍友正在看的时候在线文档突然变了,这个问题就是。不做任何限制,支持多事务之间的并发。

buhuisuanfa的博客 1867

TensorRT量化实战教程:从PTQ到QAT,让你的模型推理速度飞起来

无论是PTQ的“快速落地”,还是QAT的“精度极致”,TensorRT量化技术都能成为你模型部署路上的“性能引擎”。通过本教程的实战项目,你已掌握从技术原理到工程落地的全流程能力——现在,不妨将你的模型代入其中,亲眼见证它在速度与精度的双重提升中“焕发生机”。若你在实操中遇到任何卡点,随时可以针对具体问题交流,我会尽全力帮你突破量化部署的每一个瓶颈。

FJN110的博客 239

【MySQL数据库】事务

事务的相关说明,但没有深入到底层的锁

m0_74246469的博客 1125

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Database学习 - mysql 数据库 事务操作

事务 事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功. 数据库开启事务命令: start transaction 开启事务 rollback 回滚事务,即撤销指定的sql语句(只能回退inser deldete update语句) comm...

dixian4894的博客 124

数学建模模型总结

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

Mysql数据库事务

Mysql数据库事务定义、事务特点(原子性、一致性、隔离性、持久性)、事物之间相互影响(脏读、不可重复读、幻读、丢失更新)、如何解决事务干扰(read uncommitted、read committed、repeatable read是Mysql默认的、serializable)、事务隔离级别操作、事务控制语句(begin、rollback、rollback to 点、set autocommit、commit)、存储引擎(MyISAM、InnoDB)、查看、修改存储引擎(直接修改、修改配置、创建表指定)

一坨小橙子的博客 1211

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

MySQL数据库事务的四大特性以及事务的隔离级别

目录 一、事务的四大特性(ACID) 1、原子性(Atomicity) 2、一致性(Consistency) 3、隔离性(Isolation) 4、持久性(Durability) 二、事务的隔离级别(默认事务级别为可重复读) MySQL数据库的四种事务隔离级别 Read Uncommitted(读取未提交内容) Read Committed(读取提交内容) Repeatable...

l1394049664的博客 7万+

MySQL数据库事务

所有的变更都必须先更新缓冲池中的数据,然后缓冲池中的脏页会以一定的频率被刷入磁盘(checkPoint 机制),通过缓冲池来优化 CPU 和磁盘之间的鸿沟,这样就可以保证整体的性能不会下降太快。这样做的好处是,即使数据库系统崩溃,数据库重启后也能找到没有更新到数据库系统中的重做日志,重新执行,从而使事务具有持久性。满足 预定的约束 的状态就叫做合法的状态。事务的隔离性是指一个事务的执行 不能被其他事务干扰,即一个事务内部的操作及使用的数据对 并发 的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

iuu77的博客 964

MySQL 数据库--事务

前言 数据库事务(Database Transaction)是指作为单个逻辑工作单元执行的一系列操作,要么完整地执行,要么完全地不执行 正常情况下,这些操作将顺利进行,最终操作成功 但是,如果在这一系列过程中任何一个环节除了差错,数据库中所有信息都必须保持第一步操作前的状态不变 否则,数据库的信息将会一片混乱而不可预测 一、事务的概念及特点 1.概念 事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,.

Arlssaze的博客 1942

Mysql数据库之事务

是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即。是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,。适用于多用户同时操作的数据库系统的场景,如银行、保险公司及证券交易系统等等。通过事务的整体性以保证数据的一致性。

云计算运维工程师的成长之路 1546

laravel mysql事务无效_laravel 解决多库下的DB::transaction()事务失效问题

laravel 解决多库下的DB::transaction()事务失效问题,事务,数据库,的是,代码,操作laravel 解决多库下的DB::transaction()事务失效问题易采站长站,站长之家为您整理了laravel 解决多库下的DB::transaction()事务失效问题的相关内容。问题:最近使用laravel的DB::transaction()方法进行事务操作时,发现事务总是无效的。...

weixin_35219046的博客 543

DB-Day10笔记-数据库事务问题补充&Python与MySQL的交互

帮助0基础的小伙伴入门和学习Mysql,感兴趣的小伙伴可以开始认真学习啦!

m0_61388098的博客 503

MySQL学习-MySQL数据库事务

事务概述 1、什么是事务? 一个事务是一个完整的业务逻辑单元,不可再分。 比如:银行账户转账,从A账户向B账户转账10000.需要执行两条update语句: update t_act set balance = balance - 10000 where actno = 'act-001'; update t_act set balance = balance + 10000 where actno = 'act-002'; 以上两条DML语句必须同时成功,或者同时失败,不允许出现一条成功,一条失败。 要

Java硬件工程师的博客 2339

Mysql数据库——MyBatis使用事务

可以把一系列要执行的操作称为事务,而事务管理就是管理这些操作要么完全执行,要么完全不执行(很经典的一个例子是:A要给B转钱,首先A的钱减少了,但是突然的数据库断电了,导致无法给B加钱,然后由于丢失数据,B不承认收到A的钱;在这里事务就是确保加钱和减钱两个都完全执行或完全不执行,如果加钱失败,那么不会发生减钱)。事务管理的意义:保证数据操作的完整性。mysql中并不是所有的数据引擎都支持事务管理的,只有innodb支持事务管理。

jukuya的博客 1774

pb创建mysql事务_PB连接数据库

数据库的事务连接,以前很少接触,做个东西都是用本地的数据库,没用过远程,数据库事务的连接也都用默认的,所以就造成了对这方面基本知识的不了解,实际上就是很简单东西。首先得把数据库那边的设置弄好,ODBC也好,OLE DB也好,总之先把数据源建起来。然后就程序中的代码就这么几个东西:SQLCA.DBMS = "OLE DB"SQLCA.LogId = gs_logidSQLCA.LogPass=gs_...

weixin_28943467的博客 381
上一篇: MySQL数据库——锁 + MVCC
下一篇: MySQL数据库——索引
呢哇先生
博客等级 码龄5年 372粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值