MySQL中的事务

2023-11-16

系列文章目录

MySQL常见的几种约束

MySQL中的函数



在这里插入图片描述

前言

事务(Transaction)是用来维护数据库完整性的,它能够保证一系列的MySQL操作要么全部执行,要么全不执行。

例子1:
举一个例子来进行说明,例如转账操作:A账户要转账给B账户,那么A账户上减少的钱数和B账户上增加的钱数必须一致,也就是说A账户的转出操作和B账户的转入操作要么全部执行,要么全不执行;如果其中一个操作出现异常而没有执行的话,就会导致账户A和账户B的转入转出金额不一致的情况,为而事实上这种情况是不允许发生的,所以为了防止这种情况的发生,需要使用事务处理。
例子2:
在淘宝购物下订单的时候,商家库存要减少,订单增加记录,付款我的账号少100元…操作要么全部执行,要么全不执行。


一、事务及其特征

1、事务的概念

事务(Transaction)指的是一个操作序列,该操作序列中的多个操作要么都做,要么都不做,是一个不可分割的工作单位,是数据库环境中的逻辑工作单位,由DBMS(数据库管理系统)中的事务管理子系统负责事务的处理。
目前常用的存储引擎有InnoDB(MySQL5.5以后默认的存储引擎)和MyISAM(MySQL5.5之前默认的存储引擎),其中InnoDB支持事务处理机制,而MyISAM不支持。

2、事务的特性

事务处理可以确保除非事务性序列内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的序列,可以简化错误恢复并使应用程序更加可靠。
但并不是所有的操作序列都可以称为事务,这是因为一个操作序列要成为事务,必须满足事务的原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。这四个特性简称为ACID特性。
在这里插入图片描述

(1)原子性

原子是自然界最小的颗粒,具有不可再分的特性。事务中的所有操作可以看做一个原子,事务是应用中不可再分的最小的逻辑执行体。
使用事务对数据进行修改的操作序列,要么全部执行,要么全不执行。通常,某个事务中的操作都具有共同的目标,并且是相互依赖的。如果数据库系统只执行这些操作中的一部分,则可能会破坏事务的总体目标,而原子性消除了系统只处理部分操作的可能性。

(2)一致性

一致性是指事务执行的结果必须使数据库从一个一致性状态,变到另一个一致性状态。当数据库中只包含事务成功提交的结果时,数据库处于一致性状态。一致性是通过原子性来保证的。
例如:在转账时,只有保证转出和转入的金额一致才能构成事务。也就是说事务发生前和发生后,数据的总额依然匹配。

(3)隔离性

隔离性是指各个事务的执行互不干扰,任意一个事务的内部操作对其他并发的事务,都是隔离的。也就是说:并发执行的事务之间既不能看到对方的中间状态,也不能相互影响。
例如:在转账时,只有当A账户中的转出和B账户中转入操作都执行成功后才能看到A账户中的金额减少以及B账户中的金额增多。并且其他的事务对于转账操作的事务是不能产生任何影响的。

(4)持久性

持久性指事务一旦提交,对数据所做的任何改变,都要记录到永久存储器中,通常是保存进物理数据库,即使数据库出现故障,提交的数据也应该能够恢复。但如果是由于外部原因导致的数据库故障,如硬盘被损坏,那么之前提交的数据则有可能会丢失。

二、事务并发问题

1.脏读(Dirty read)

当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的。
在这里插入图片描述

2.不可重复读 (Unrepeatableread)

(Unrepeatableread): 指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。
在这里插入图片描述

3.幻读 (Phantom read)

(Phantom read): 幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。
在这里插入图片描述

隔离级别 脏读 不可重复读 幻读
READ UNCOMMITTED
READ COMMITTED ×
REPEATABLE READ × ×
SERIALIZABLE × × ×

PS:√ 代表会出现问题 , ×代表不会出现问题

三、事务隔离级别

事务的隔离级别用于决定如何控制并发用户读写数据的操作。数据库是允许多用户并发访问的,如果多个用户同时开启事务并对同一数据进行读写操作的话,有可能会出现脏读、不可重复读和幻读问题,所以MySQL中提供了四种隔离级别来解决上述问题。

事务的隔离级别从低到高依次为READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ以及SERIALIZABLE,隔离级别越低,越能支持高并发的数据库操作。


总结

在MySQL中,事务通常用于以下场景:

1、订单处理:当用户下订单时,我们需要确保库存数量、金额等信息的正确性。如果出现错误,我们需要回滚订单,撤销库存的更改。

2、银行转账:当进行银行转账操作时,我们需要确保账户余额的正确性。如果出现错误,我们需要回滚转账操作,撤销资金的更改。

3、数据更新:当我们需要更新多个表中的数据时,我们可以使用事务来确保数据的一致性。例如,我们先更新一个表中的数据,然后再更新另一个表中的数据。如果在这个过程中出现了错误,我们可以回滚整个事务,撤销所有的更改。

为了保证事务的原子性、一致性和隔离性,MySQL提供了多种锁定机制和隔离级别。例如,行级锁和表级锁可以帮助我们控制并发访问,不同的隔离级别可以影响事务之间的可见性和并发性。

总之,MySQL中的事务是一个非常强大的功能,它可以帮助我们处理复杂的业务逻辑和保证数据的一致性和完整性。在使用事务时,需要注意避免死锁和性能问题,并根据实际情况选择合适的锁定机制和隔离级别。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL中的事务 的相关文章

  • 使用 Hibernate 在 MySQL 中存储字节数组

    我正在尝试保存带有字节数组字段的实体 我在 MySQL 数据库之上使用 Hibernate 和 JPA 这是字段定义 对于嵌入式 H2 数据库来说效果很好 Entity name blob public class Blob Lob Bas
  • Hibernate 可以使用 MySQL 的“ON DUPLICATE KEY UPDATE”语法吗?

    MySQL 支持 INSERT ON DUPLICATE KEY UPDATE 语法允许您 盲目 插入数据库 并回退到更新现有记录 如果存在 当您想要快速事务隔离并且想要更新的值取决于数据库中已有的值时 这非常有用 作为一个人为的示例 假设
  • 如何用 UNION 运算符替换 OR 运算符?

    这是我的查询 SELECT h id h subject h body matnF h amount h keywords tags h closed h author id author h AcceptedAnswer h type h
  • Codeigniter 加入多个条件

    我正在使用 Codeigniter Active Records 课程 我想加入我的users与我的桌子clients表 这样我就可以显示用户的 真实 姓名 而不仅仅是他们的 ID 这是什么clients表看起来像 示例 列 a 1 a 2
  • MySQL 按主键排序

    某些 SQL 服务器允许使用通用语句 例如ORDER BY PRIMARY KEY 我不相信这适用于 MySQL 是否有任何此类解决方法可以允许跨多个表自动选择 或者是否需要查找查询来确定主键 我一直在研究的解决方法包括调用SHOW COL
  • 在docker中使用MySQL数据库设置aspnetcore

    我正在尝试设置一个 docker compose 文件 其中包含 asp net core mysql 数据库和 phpmyadmin 的容器 设置我的 mysql 服务器没有问题 我可以使用 phpmyadmin 访问它 我的 asp n
  • 将 UPDATE 转换为 INSERT INTO ON DUPLICATE KEY UPDATE 语句

    我有这个 UPDATE MySQL 语句 效果很好 UPDATE table1 Inner Join table2 ON table2 id table1 gw id SET table1 field1 1 table1 field2 2
  • MySQL+子串怎么做? + 替换?

    我不太擅长 SQL 希望能够变得更好 我在尝试执行某些表操作时遇到一些麻烦 我希望能够从下面的 ProgUID 列中选择子字符串 就像是 SUBSTRING table ProgUID 3 12 这将为我提供 ProgUID P CAMVE
  • 通过连接从两个表中删除?

    我有两个表如下 tbl1 tbl2 id article id title image whole news tags author older datetime 其中 tbl1 id gt tbl2 article id 如何从两个表中删
  • 如何将 MySQL 数据库更改为 UTC?

    我使用的是 Windows 7 对数据库方面的东西有点陌生 我尝试在 Google 上搜索如何将系统时区更改为 UTC 但文档有些高级 我不太确定如何更改此字段 在 my ini 文件的 mysqld 部分下 添加以下行 default t
  • 将记录分成两列

    我的数据库中有一个 学生 表 其中包含大约 5 000 条记录 我想将这些记录显示在two分区 如何在不执行查询两次的情况下做到这一点 仅使用单个查询 显示示例http www freeimagehosting net uploads f1
  • Mysql innoDB 不断崩溃[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我的数据库 mysql 服务器不断崩溃 重新启动 我不知道该怎么办 我不断在 dbname org err 文件中收到以下内容 13120
  • Hibernate 对集合的查询过滤器

    我想执行以下查询 from Item i where i categoryItems catalogId catId 然而 这会产生以下异常 非法尝试取消引用集合 所以我用谷歌搜索 找到了这个 Hibernate 论坛帖子https for
  • 当sql连接中存在两个同名列时,如何从一个表列中获取值

    当我连接两个具有相同名称列的表时 我目前面临着尝试获取值的问题 例如 table1 date和table2 date 每个表中的日期不同 我将如何获取 日期 本例中的表1 我目前正在跑步 while row mysqliquery gt f
  • 截断 Mysql 表 Cron 作业?

    我在如何使用 cron 作业截断 Mysql 表时遇到了一些麻烦 无论我尝试什么 我似乎都无法让数据库清除表格 感谢您的帮助 mysql uderp example pexample hlocalhost Dexample e TRUNCA
  • 为什么这会返回资源 id #2? [复制]

    这个问题在这里已经有答案了 可能的重复 我如何从 PHP 中的 MySql 响应中 回显 资源 id 6 https stackoverflow com questions 4290108 how do i echo a resource
  • Mysql 检索所有有限制的行

    我想检索特定用户的所有行 限制为 0 x 所以我只是想问是否有任何方法可以检索 mysql 中的所有行 而不调用返回 x 的 count id 的方法 而不重载现有函数 该函数在查询中根本没有限制 与我们的 string Relace 功能
  • MySQL 使用 ALTER IGNORE TABLE 出现重复错误

    我的 MySQL 中有一个有重复项的表 我尝试删除重复项并保留一项 我没有主键 我可以通过以下方式找到重复项 select user id server id count as NumDuplicates from user server
  • 如何正确转义mysql?

    我刚刚发现如果我写 select from tbl where name like foo 然后添加 foo 作为参数及其值 a 用户数据 它不会正确转义 我勒个去 它想要 a 即使我使用参数 我还是忍不住觉得我对 sql 注入持开放态度
  • 忽略重复条目并在 EF Core 中的 DbContext.SaveChanges() 上提交成功条目

    我有一个 ASP Net Core 2 2 Web API 在我的一个控制器操作中 我向 MySQL 数据库表添加了一堆行 我使用的是 Pomelo 例如 dbContext AddRange entities dbContext Save

随机推荐

  • IOS开发笔记之常用的第三方库(太多了。)

    图像 1 图片浏览控件MWPhotoBrowser 实现了一个照片浏览器类似 iOS 自带的相册应用 可显示来自手机的图片或者是网络图片 可自动从网络下载图片并进行缓存 可对图片进行缩放等操作 下载 https github com mwa
  • js-- 1-100循环

  • Linux系统中运行.sh文件的几种方法

    在Linux系统中执行 sh文件的几种方法 1 cd到 sh文件所在的目录 然后执行 xxx sh 前提 该 sh文件要有可执行的权限 chmod u x xxx sh 2 在任何路径下 输入 sh文件的绝对路径进行执行 前提 该 sh文件
  • 统计代码耗时

    二 常规方法 2 1 时间差统计 这种方式是最简单的方法 记录下开始时间 再记录下结束时间 计算时间差即可 public class TimeDiffTest public static void main String args thro
  • 安鸾之中间件系列

    声明 文中所涉及的技术 思路和工具仅供以安全为目的的学习交流使用 任何人不得将其用于非法用途以及盈利等目的 否则后果自行承担 本文转发于涂寐 s Blogs https 0xtlu github io 0x00 tomcat8弱口令 0o0
  • upx3.94手动脱壳

    工具 吾爱破解论坛Ollydbg ImportREConstructor upx3 94下载地址 https github com upx upx releases download v3 94 upx394w zip 环境 XP 还是XP
  • 换盘符cd的用法

    如果是在本盘内切换文件夹 直接使用cd 后面跟地址即可 如果是跨区切换地址 cd 后面就需要跟 d 斜杠d d就代表着跨分区切换地址 cd d d C ProgramData Anaconda3 Scripts gt cd d d d gt
  • linux之查看端口占用

    第一章 linux之帮助命令 第二章 linux命令行快捷键 第三章 linux之防火墙 第四章 linux之服务开机自启 第五章 linux之关机与重启 第六章 linux之环境变量 第七章 linux之目录操作命令 第八章 linux之
  • esp8266与stm32、手机通讯(原子云)——hal库(有代码)

    本文所讲 正点原子的wifi模块esp8266与正点原子开发板战舰V3 stm32f103zet6 及手机app通讯 esp8266分为三种工作模式 STA 8266连接到网络比如wifi 手机热点等 AP 8266作为热点 由手机连接到8
  • 规则引擎Drools使用 第二篇Drools规则引擎介绍

    Drools规则引擎介绍 drools是一款由JBoss组织提供的基于Java语言开发的开源规则引擎 可以将复杂且多变的业务规则从硬编码中解放出来 以规则脚本的形式存放在文件或特定的存储介质中 例如存放在数据库中 使得业务规则的变更不需要修
  • Idea自带的http client工具使用攻略

    平时都是用postman来调接口 有时候也会用到swagger 用swagger还可以 直接在浏览器上开个页面即可 但是postman就不行了 需要单独的运行 个人感觉postman还是比较占内存的 最近和一个其他组同事联调 发现他们使用的
  • python跳出for循环

    一 问题描述 在二维数组的遍历中 我们经常使用双层for循环 在某些时候 我们并不需要遍历整个二维数组 当条件满足时就应该终止for循环 但是 直接在内层循环中break并不会让外层循环也终止 二 解决方案 使用for else 语法解决
  • STM32的烧录和Hex/bin烧录文件解析、烧录文件是被如何存储到MCU中的?

    什么是hex文件 以 hex为后缀的文件我们称之为HEX文件 hex是intel规定的标准 hex的全称是Intel HEX 此类文件通常用于传输将被存于ROM或EEPROM中的程序和数据 是由一行行符合Intel HEX文件格式的文本所构
  • OpenWRT中的按键和灯的GPIO控制实现

    原文地址 点击打开链接 基于BarrierBreaker版本 基于AR9331 AP121 Demo单板 来进行描述 1 灯 A 在mach ap121 c中 定义了灯所对应的GPIO定义 define AP121 GPIO LED WLA
  • 详解以太坊的工作原理

    这篇文章主要讲解以太坊的基本原理 对技术感兴趣的朋友可以看看 翻译作者 许莉 原文地址 How does Ethereum work anyway 简介 不管你们知不知道以太坊 Ethereum blockchain 是什么 但是你们大概都
  • [机器学习入门笔记] 3. 监督学习单模型部分

    文章目录 前言 1 机器学习预备知识 1 1 关键术语与任务类型 1 2 机器学习三要素 1 3 机器学习的核心 1 4 机器学习流程 第 2 章 线性回归 2 1 线性回归的原理推导 2 2 线性回归的代码实现 2 2 1 基于Numpy
  • 网站反爬虫requests获取不到数据怎么办?

    import requests import re content requests get https blog csdn net seanyang type blog headers content decode 想通过requests
  • HackerRank Triangle Quest 2

    给你一个正整数n 例如n 5 则输出 1 121 12321 1234321 123454321 思路 这就是1 11 111 1111 的平方 题目不让用字符串做 或者代码不能超过一行见代码 for i in range 1 int in
  • JSON与JAVA数据的相互转换

    先做个记号 JSON与JAVA数据的相互转换
  • MySQL中的事务

    系列文章目录 MySQL常见的几种约束 MySQL中的函数 文章目录 系列文章目录 前言 一 事务及其特征 1 事务的概念 2 事务的特性 1 原子性 2 一致性 3 隔离性 4 持久性 二 事务并发问题 1 脏读 Dirty read 2