【MySQL】事务(上)

news2024/11/23 9:25:57

文章目录

  • 事务概念
  • 什么是事务?
  • 为什么要有事务?
  • 事务的版本支持
  • 事务的提交方式
  • 事务常见操作方式
  • 基本操作

事务概念

mysql 本身内部采用 多线程的方式,来实现数据存储 相关的工作 就注定对数据 有并发访问的场景
为了解决这类问题,就提供了 事务 的概念


火车票售票系统中 存在一张tickets表,包含 id 、name 和 nums(票数)

mysql是一个网络服务,被一个人访问时,也有可能被其他人访问
当客户端A和客户端B 同时向火车票售票系统 购买票时
假设只有一张票,当客户端A想要买票时,经过if判断时,发现票数为1
但可能由于mysql内部的多线程 被调度了,负责给客户端A买票的线程被挂起了

当客户端B想要买票时,经过if判断,发现票数依旧为1
就会出现 仅有的一张票被卖了两次


增删查改 满足 以下情况,即可解决上述问题

买票的过程需要 是原子的
( 要不就别买票,要买 就将票买完)

买票互相不能影响
( 不能发生 A正在买票,B也过来买票的情况,A和B两者买票不能互相影响)

买完票要永久有效
(不能发生买完票后,不承认该票存在的情况)

买前和买后的状态是确定的
(买前就是没买票,买后就是买了票,不能出现中间状态的情况)


什么是事务?

编写sql语句时,有可能一条sql语句是解决不掉问题的,需要一批sql语句共同组合才能完成
如:从银行卡A中提钱,向银行卡B转账,将银行卡A中的钱减100,再将银行卡B中的钱加100
使用两条sql 语句 才能完成,单独一条语句是完不成操作的

事务 是由 一条或者多条事务 构成的集合体,这个集合体 需要共同完成某种任务
构成这个集合体的语句,要么全部失败,要么全部成功
同样事务规定不同的客户端 看到的数据是不同的


事务主要处理 操作量大、复杂度高的数据
如:你毕业了,学校的教务系统中要删除你的全部数据,除了删除姓名、电话等基本信息,还要删除你的其他有关信息


mysql为了保证事务的正确运行,就需要维护四大属性

原子性: 一个事务的所有操作,要么就全部都完成,要么就全部都不完成,不会出现结束在中间某个环节

隔离性: 数据库允许多个并发事务 同时对其数据进行 读写和修改的能力
隔离性可以防止多个事务 并发执行时由于交叉执行而导致数据的不一致
其中隔离级别 分为 未提交(Read uncommitted) 、读提交(read committed)、可重复读(repeatable read)以及 串行化( Serializable)

持久性: 事务处理结束后,对数据的修改 就是永久的, 即便系统故障也不会丢失

一致性: 在事务开始之前和事务结束过程之后,数据库的完整性没有被破坏
( 在操作之前 对操作之后 所发生的事情 进行预期,并且在操作后,其发生的事情与预期相同)


四大属性 简称为ACID
原子性(Atomicity)
一致性(Consistency)
隔离性(Isolation)
持久性(Durability)


为什么要有事务?

事务 被 MySQL 编写者设计出来
本质是为了当应用程序访问数据库时,事务能简化编程模型,不需要去考虑潜在错误和并发问题
事务本质上是为应用层服务的, 而不是随着数据库天然就有的

事务的版本支持

输入 show engines \G 查询mysql支持的存储引擎


发现是支持 innodb储存引擎的,并且默认是 innodb
在comment描述中,说明支持事务
myisam 是不支持事务的


事务的提交方式

事务共有两种提交方式: 手动提交 自动提交


输入 show variables like ‘autocommit’ 查询提交方式
ON 表示 自动提交


输入 set autocommit =0; OFF表示关闭自动提交


输入 set autocommit =1; ON表示打开自动提交


事务常见操作方式

输入 set global transaction isolation level read uncommitted;
将mysql的隔离级别设置成 读未提交(read uncommitted)

再输入 select @@tx_isolation; 查询当前的隔离级别
发现隔离级别 依旧为 可重复读(repeatable read) 而不是读未提交


将隔离级别修改后 ,需要重启客户端

重启后,再次输入 select @@tx_isolation; 进行查询
发现隔离级别 已经变为 读未提交(read uncommitted)


基本操作

创建一张表 acount,其中包含 约束为主键的key 、不为空 并且默认为空字符串的name
指定长度为10 小数部分为2位 并且默认为0.0 的blance


输入 show variables like ‘autocommit’ 查询提交方式
ON 表示 自动提交
说明当前提交方式为自动提交


启动事务的方案 为 start transaction begin

在终端1 和终端2 中 分别 使用 start transaction begin 启动不同的事务


在终端1中 输入 savepoint s1 记录 保存点 s1
并向 account表中插入 数据
插入后,再次设置保存点 s2


在终端2中,输入 select * from account 查询account表的信息 就可以查到插入的数据


在终端1中,再次插入数据
在终端2中,依旧可以从表中查到数据


在终端1中,若不想把 李四插入到表中,可以进行定向回滚
输入 rollback to s2 回滚到保存点s2

在终端2中,此时再次查询account表中数据,发现只有张三存在

最终输入 commit 结束事务


在终端1中 插入数据后 , 若直接输入 rollback 则会将表中数据全部清空


若想将对应的两个插入操作,变为 持久化 保存到 mysql中
先 输入 commit 进行提交
再输入 rollback 清空表时 ,发现 表中数据依旧存在

即已经进行提交的操作, 是没办法进行回滚的

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RestCloud AppLink已支持的数据源有哪些?

RestCloud AppLink是什么? 首先,我们需要了解RestCloud AppLink是什么,AppLink是一款由RestCloud公司推出的超级应用连接器。不需要开发,零代码,低成本即可快速打通数百款应用之间的数据。通过流程搭建,可…

【ATTCK】MITRE Caldera 简介

一、什么是Caldera caldera是一个基于MITRE ATT&CK™构建的网络安全框架。其目标是创建一种工具,通过提供自动化安全评估来增强网络从业者的能力,从而节省用户的时间、金钱和精力。为此,需要几个关键组件才能使 Caldera 成为行业领先的平…

在Gradio实现两个下拉框进行联动案例解读:change/click/input实践(三)

本文的代码来自ChuanhuChatGPT,通过拆解写得比较好的gradio项目,可以更快理解gradio的一些使用。 ChuanhuChatGPT整体页面效果是比较合理的: 1 下拉框联动效果的解读 本篇是将一个其中【对话】中的【Prompt加载】小模块抽取出来并稍稍修改…

电商平台api接口,淘宝/天猫、1688、拼多多、亚马逊等电商数据平台api接口演示案例

API简单来说是一种数据的传输方式,使用已经开发好的API接口可以缩短项目时间,减少开发成本。 比如说数据宝平台提供的实名认证API接口,像这种实名认证类的API接口是无法自行开发的,如果自行对接部委,能否成功不说&…

【已解决】vscode 配置C51和MDK环境配置

使用命令 gcc -v -E -x c - 看自己gcc 有没有安装好 也可以在自己的vscode中新建一个终端 gcc -v g -v 首先把自己的C51 和MDK 路径 设置好 vscode 中设置 C51 和 MDK 的路径 这是你keil 中写 51单片机和 STM32 的 如果你出现什么include 的什么波浪线,那估计…

力扣511. 游戏玩法分析 I

答案: select player_id,min(event_date) as first_login from Activity a group by player_id我最开始写的错误答案是这样的: select player_id,event_date as first_login from Activity a group by player_id having event_date min(event_date…

一篇揭秘Linux高性能服务epoll 的本质

导语 epoll接口是为解决Linux内核处理大量文件描述符而提出的方案。该接口属于Linux下多路I/O复用接口中select/poll的增强。其经常应用于Linux下高并发服务型程序,特别是在大量并发连接中只有少部分连接处于活跃下的情况 (通常是这种情况),在该情况下能…

copilot 产生 python工具函数并生成单元测试

stock.py 这个文件,我只写了注释(的开头),大部分注释内容和函数都是copilot # split a string and extract the environment variable from it # input can be , pathabc, pathabc;pathdef, pathabc;pathdef;pathghi # output i…

快速拉取聚水潭单据的ETL工具

聚水潭介绍 聚水潭平台则是国内较为出名的电商ERP平台,为企业提供了便捷的销售和管理服务,专注于提高交易效率,但是如何将数据快速同步到其他系统一直是很多企业的痛点。 ETLCloud数据集成平台提供了丰富的数据分析工具和算法模型&#xff…

Oracle 账户被锁:the account is locked 解决方法

Oracle 账户被锁:the account is locked 解决方法 连接Oracle数据库时报错账户已锁定错误 解决方法一:命令行模式: 步骤一: WinR打开命令行输入:sqlplus 使用system或sys账户以管理员身份登录,口令即安装…

MySQL如何查找删除重复行?

如何查找重复行 第一步是定义什么样的行才是重复行。多数情况下很简单:它们某几列具有相同的值。本例采用这种定义,或许你对“重复”的定义得很复杂,你需要对sql做些修改。本例要用到的数据样本: create table test(id int not …

学用 DevChat 的 VSCode 插件,体验AI智能编程工具 (一)

简单说DevChat是一个辅助编程的智能工具,它可以通过自然语言对话的方式与开发者进行交流,帮助开发者更高效地完成编程任务。 有了人工智能工具,编程进入一个新天地。 闻名已久,不若体验一下。 一.准备工作 1.运行环境. A. p…

MS512非接触式读卡器 IC

MS512 是一款应用于 13.56MHz 非接触式通信中的高集 成度读写卡芯片。它利用了先进的调制和解调技术,完全集 成了在 13.56MHz 下的各种非接触式通信方式和协议。 主要特点  高度集成的解调和解码模拟电路  采用少量外部器件,即可将输出驱动级接…

如何使用群晖虚拟机部署本地网页文件实现公网远程访问?

文章目录 前言1. 安装网页运行环境1.1 安装php1.2 安装webstation 2. 下载网页源码文件2.1 访问网站地址并下载压缩包2.2 解压并上传至群辉NAS 3. 配置webstation3.1 配置网页服务3.2 配置网络门户 4. 局域网访问静态网页配置成功5. 使用cpolar发布静态网页,实现公网…

本地PHP搭建简单Imagewheel私人云图床,在外远程访问——“cpolar内网穿透”

文章目录 1.前言2. Imagewheel网站搭建2.1. Imagewheel下载和安装2.2. Imagewheel网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar临时数据隧道3.2.Cpolar稳定隧道(云端设置)3.3.Cpolar稳定隧道(本地设置) 4.公网访问测…

互联网金融P2P主业务场景自动化测试

互联网金融P2P行业,近三年来发展迅速,如火如荼。 据不完全统计,全国有3000的企业。 “互联网”企业,几乎每天都会碰到一些奇奇怪怪的bug,作为在互联网企业工作的测试人员,风险和压力都巨大。那么我们如何降…

学习c#的第九天

目录 C# 可空类型(Nullable) C# 可空类型(Nullable) Null 合并运算符( ?? ) C# 数组(Array) 一维数组 声明及初始化赋值数组 多维数组 声明和初始化多维数组 访问和操作多…

【备忘】在Nginx服务器安装SSL证书

您可以在Nginx或Tengine服务器上安装SSL证书,实现通过HTTPS安全访问Web服务器。本文介绍如何为Nginx或Tengine服务器安装SSL证书。 重要 本文以CentOS 8.0 64位操作系统、Nginx 1.14.2为例介绍。不同版本的操作系统或Web服务器,部署操作可能有所差异&a…

<MySQL> MySQL中查询(retrieve)数据的基础操作

目录 一、查询(retrieve) 1.1 查询数据的方式概述 二、全列查询 2.1 语法 2.2 操作演示 2.3 全列查询需要慎重使用 三、指定列查询 3.1 语法 3.2 操作演示 四、表达式查询 4.1 语法 4.2 操作演示 4.3 null 参与表达式计算 4.3 表达式查询存…