9. MySQL事务、字符集

news2024/10/5 18:31:40

文章目录

  • 【 1. 事务 Transaction 】
    • 1.1 事务的基本原理
    • 1.2 MySQL 执行事务的语法和流程
      • 1.2.1 开始事务
      • 1.2.2 提交事务
      • 1.2.3 回滚(撤销)事务
      • 实例1:一致性
      • 实例2:原子性
  • 【 2. 字符集 和 校对规则 】
    • 2.1 基本原理
    • 2.2 查看字符集
      • 查看当前 MySQL 使用的字符集
      • 查看 MySQL 可用的字符集
    • 2.3 查看校对规则
      • 查看当前 MySQL 使用的校对规则
      • 查看 MySQL 中可用的校对规则
      • 实例:校对规则对字符比较的影响

【 1. 事务 Transaction 】

1.1 事务的基本原理

  • 问题背景
    当多个用户访问同一数据时,一个用户在更改数据的过程中可能有其它用户同时发起更改请求,为保证数据的一致性状态,MySQL 引入了事务。
  • 数据库的 事务(Transaction)一种机制、一个操作序列,包含了一组数据库操作命令。事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行,因此 事务是一个不可分割的工作逻辑单元
    在数据库系统上执行 并发操作时,事务是作为最小的控制单元 来使用的,特别适用于多用户同时操作的数据库系统。例如,航空公司的订票系统、银行、保险公司以及证券交易系统等。
  • 事务具有 4 个特性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),这 4 个特性通常简称为 ACID 。事务的 ACID 原则保证了一个事务或者成功提交,或者失败回滚,二者必居其一。因此,它对事务的修改具有可恢复性当事务失败时,它对数据的修改都会恢复到该事务执行前的状态。
    • 原子性(Atomicity)
      事务是一个完整的操作,事务的各元素是不可分的(原子的)事务中的所有元素必须作为一个整体提交或回滚,如果事务中的任何元素失败,则整个事务将失败。
      以银行转账事务为例,如果该事务提交了,则这两个账户的数据将会更新。如果由于某种原因,事务在成功更新这两个账户之前终止了,则不会更新这两个账户的余额,并且会撤销对任何账户余额的修改,事务不能部分提交。
    • 一致性(Consistency)
      当事务完成时,数据必须处于一致状态 。也就是说,在事务开始之前,数据库中存储的数据处于一致状态;在正在进行的事务中,数据可能处于不一致的状态,如数据可能有部分被修改;然而,当事务成功完成时,数据必须再次回到已知的一致状态。即 通过事务对数据所做的修改不能损坏数据,或者说事务不能使数据存储处于不稳定的状态。
      以银行转账事务事务为例。在事务开始之前,所有账户余额的总额处于一致状态。在事务进行的过程中,一个账户余额减少了,而另一个账户余额尚未修改,此时,所有账户余额的总额处于不一致状态。当转账成功后,即另一个账户余额增加后,即事务完成以后,账户余额的总额再次恢复到一致状态。
    • 隔离性(Isolation)
      对数据进行修改的 所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务。
      • 修改数据的事务可以在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据。
      • 当事务修改数据时,如果任何其他进程正在同时使用相同的数据,则直到该事务成功提交之后,对数据的修改才能生效。
        例如,张三和李四之间的转账与王五和赵二之间的转账,永远是相互独立的。
    • 持久性(Durability)
      事务的持久性指 一个事务成功完成之后,它对数据库所作的改变是永久性的,即使系统出现故障也是如此。也就是说,一旦事务被提交,事务对数据所做的任何变动都会被永久地保留在数据库中。

1.2 MySQL 执行事务的语法和流程

  • 任何一种数据库,都会拥有各种各样的 日志 ,用来记录数据库的运行情况、日常操作、错误信息等,MySQL 也不例外。
    例如,当用户 root 登录到 MySQL 服务器,就会在日志文件里记录该用户的登录时间、执行操作等。
  • 为了维护 MySQL 服务器,经常需要在 MySQL 数据库中进行日志操作:
    • UNDO 日志 (中文译为取消):复制事务执行前的数据,用于在事务发生异常时回滚数据。
    • REDO 日志 (中文译为重做):记录在事务执行中,每条对数据进行更新的操作,当事务提交时,该内容将被刷新到磁盘。
  • MySQL 提供了多种存储引擎来支持事务 。支持事务的存储引擎有 InnoDB 和 BDB,InnoDB 存储引擎事务主要通过 UNDO 日志和 REDO 日志实现 ,MyISAM 存储引擎不支持事务。

1.2.1 开始事务

  • 默认设置下,每条 SQL 语句就是一个事务,即执行 SQL 语句后自动提交。为了达到将几个操作做为一个整体的目的,需要使用 BEGIN 或 START TRANSACTION 开启一个事务,或者禁止当前会话的自动提交。
    基本语法
BEGIN;

#或

START TRANSACTION;

1.2.2 提交事务

  • 基本语法
    • COMMIT 表示提交事务,即提交事务的所有操作,具体地说,就是将事务中所有对数据库的更新都写到磁盘上的物理数据库中,事务正常结束,这体现了事务的持久性。
    • 提交事务,意味着将事务开始以来所 执行的所有数据都修改成为数据库的永久部分,因此也 标志着一个事务的结束一旦执行了该命令,将不能回滚事务。只有在所有修改都准备好提交给数据库时,才执行这一操作。
COMMIT;

1.2.3 回滚(撤销)事务

  • 基本语法
    • ROLLBACK 表示撤销事务,即在 事务运行的过程中发生了某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成的操作全部撤销,回滚到事务开始时的状态,并且释放由事务控制的资源。这里的操作指对数据库的更新操作。 ROLLBACK 语句也标志着事务的结束
ROLLBACK;
  • 总结:
    BEGIN 或 START TRANSACTION 语句后面的 SQL 语句对数据库数据的更新操作都将记录在事务日志中,直至遇到 ROLLBACK 语句或 COMMIT 语句。
    • 如果事务中某一操作失败且执行了 ROLLBACK 语句,那么在开启事务语句之后所有更新的数据都能回滚到事务开始前的状态。
    • 如果事务中的所有操作都全部正确完成,并且使用了 COMMIT 语句向数据库提交更新数据,则此时的数据又处在新的一致状态。

实例1:一致性

  • 下面模拟在张三的账户减少 500 元后,李四的账户还未增加 500 时,有其他会话访问数据表的场景。由于代码需要在两个窗口中执行,为了方便阅读,这里我们称为 A 窗口和 B 窗口。
  1. 创建数据表 bank。
    CREATE TABLE bank(
    customerName VARCHAR(25),
    currentMoney float
    );
  2. 插入数据。
    INSERT INTO bank VALUES("张三",500),("李四",500);
  3. 在 A 窗口中开启一个事务,并更新 bank 数据表的数据:让张三的currentMoney - 500。
    BEGIN;
    UPDATE bank SET currentMoney = currentMoney-500 WHERE customerName='张三';
  4. 在 B 窗口中查询 bank 数据表中的数据。
    从结果可以看出,虽然 A 窗口中的事务已经更改了 bank 表中的数据,但没有立即更新数据这是因为还没有提交事务,这时其他会话读取到的仍然是更新前的数据。
    SELECT * FROM bank;
    在这里插入图片描述
  5. 在 A 窗口中继续执行事务:让李四的 currentMoney+500,最后提交事务。
    UPDATE bank SET currentMoney = currentMoney+500 WHERE customerName='李四';
    COMMIT;
  6. 在 B 窗口中再次查询 bank 数据表的数据。
    结果可以看出张三和李四的账户余额总和与转账前保持一致,这样数据从一个一致性状态更新到另一个一致性状态。
    SELECT * FROM bank;
    在这里插入图片描述

实例2:原子性

  • 在例 1 中,张三的账户余额已经减少到 0 元,如果再转出 100 元,将会出现余额为负数,因此需要回滚到原始状态。
  1. 将张三的账户余额减少 1000 元。
    BEGIN;
    UPDATE bank SET currentMoney = currentMoney-1000 WHERE customerName='张三';
  2. 让事务回滚
    ROLLBACK;
  3. 查看结果。
    SELECT * FROM bank;
    在这里插入图片描述

【 2. 字符集 和 校对规则 】

2.1 基本原理

  • 字符(Character) 是计算机中字母、数字、符号的统称,一个字符可以是一个中文汉字、一个英文字母、一个阿拉伯数字、一个标点符号等。
  • 计算机是以二进制的形式来存储数据的。平时我们在显示器上看到的数字、英文、标点符号、汉字等 字符都是二进制数转换之后的结果
  • 字符集(Character set) 定义了 字符和二进制的对应关系,为字符分配了唯一的编号 。常见的字符集有 ASCII、GBK、IOS-8859-1 等。
  • 字符编码/字集码(Character encoding) 规定了 如何将字符的编号存储到计算机中
    • 大部分字符集都只对应一种字符编码,例如:ASCII、IOS-8859-1、GB2312、GBK,都是既表示了字符集又表示了对应的字符编码,所以一般情况下,可以将字符集和字符编码视为同义词。
    • Unicode 有三种编码方案:UTF-8、UTF-16 和 UTF-32。最为常用的是 UTF-8 编码。
  • 校对规则/排序规则(Collation) 是指 在同一个字符集内字符之间的比较规则。字符集和校对规则是一对多的关系,每个字符集都有一个默认的校对规则。字符集和校对规则相辅相成,相互依赖关联。
    简单来说,字符集用来定义存储字符串的方式,校对规则用来定义 比较字符串的方式。
    • 有些数据库并没有清晰的区分开字符集和校对规则。例如,在 SQL Server 中创建数据库时,选择字符集就相当于选定了字符集和校对规则。
    • 在 MySQL 中,字符集和校对规则是区分开的,必须设置字符集和校对规则。一般情况下,没有特殊需求,只设置其一即可。只设置字符集时,MySQL 会将校对规则设置为字符集中对应的默认校对规则。
  • MySQL字符集的转换过程
    1. 在命令提示符窗口(cmd 命令行)中执行 MySQL 命令或 sql 语句时,这些命令或语句从 命令提示符窗口字符集 转换为 character_set_client MySQL 客户端使用的字符集
    2. 使用命令提示符窗口成功连接 MySQL 服务器后,就建立了一条“数据通信链路”,MySQL 命令或 sql 语句沿着“数据链路”传向 MySQL 服务器,由 character_set_client 定义的字符集转换为 character_set_connection 连接数据库时使用的字符集
    3. MySQL 服务实例收到数据通信链路中的 MySQL 命令或 sql 语句后,将 MySQL 命令或 sql 语句从 character_set_connection 定义的字符集转换为 character_set_server MySQL 服务器使用的字符集
    4. 若 MySQL 命令或 sql 语句针对于某个数据库进行操作,此时将 MySQL 命令或 sql 语句从 character_set_server 定义的字符集转换为 character_set_database 创建数据库使用的字符集
    5. MySQL 命令或 sql 语句执行结束后,将执行结果设置为 character_set_results 数据库给客户端返回数据时使用的字符集
    6. 执行结果沿着打开的数据通信链路原路返回,将执行结果从 character_set_results 定义的字符集转换为 character_set_client MySQL 客户端使用的字符集,最终转换为命令提示符窗口字符集,显示到命令提示符窗口中。
      在这里插入图片描述

2.2 查看字符集

查看当前 MySQL 使用的字符集

  • 基本语法:
SHOW VARIABLES LIKE 'character%';

在这里插入图片描述
乱码时,不需要关心 character_set_filesystem、character_set_system 和 character_sets_dir 这 3 个系统变量,它们不会影响乱码

名称说明
character_set_clientMySQL 客户端使用的字符集
character_set_connection连接数据库时使用的字符集
character_set_database创建数据库使用的字符集
character_set_filesystemMySQL 服务器文件系统使用的字符集,默认值为 binary,不做任何转换
character_set_results数据库给客户端返回数据时使用的字符集
character_set_serverMySQL 服务器使用的字符集,建议由系统自己管理,不要人为定义
character_set_system数据库系统使用的字符集,默认值为 utf8,不需要设置
character_sets_dir字符集的安装目录

查看 MySQL 可用的字符集

  • 基本语法:
SHOW CHARACTER set;

# 或者通过查询 information_schema.character_set 表中的记录,来查看 MySQL 支持的字符集:
SELECT * FROM information_schema.character_sets;
- 第一列(Charset)为字符集名称;
- 第二列(Description)为字符集描述;
- 第三列(Default collation)为字符集的默认校对规则;
- 第四列(Maxlen)表示字符集中一个字符占用的最大字节数。

在这里插入图片描述

2.3 查看校对规则

查看当前 MySQL 使用的校对规则

  • 基本语法
    • collation_connection:连接数据库时使用的校对规则
    • collation_database:创建数据库时使用的校对规则
    • collation_server:MySQL 服务器使用的校对规则
    • 校对规则命令约定如下:
      • 以校对规则所对应的字符集名开头
      • 以国家名居中(或以 general 居中)
      • 以 ci、cs 或 bin 结尾,ci 表示大小写不敏感,cs 表示大小写敏感,bin 表示按二进制编码值比较。
SHOW VARIABLES LIKE '字符集名称';

在这里插入图片描述

  • 或者 使用 SHOW COLLATION LIKE 'gbk%';
    下面运行结果为 GBK 字符集所对应的校对规则,其中 gbk_chinese_ci 是默认的校对规则,对大小写不敏感。而 gbk_bin 按照二进制编码的值进行比较,对大小写敏感。
    在这里插入图片描述

查看 MySQL 中可用的校对规则

  • 通过查询 information_schema.COLLATIONS 表中的记录,来查看 MySQL 中可用的校对规则。
    基本语法:
SELECT * FROM information_schema.COLLATIONS;

在这里插入图片描述

实例:校对规则对字符比较的影响

注意此时不要用 unicode 的命令行。

  • 实例1
    指定“A”和“a”按照 gbk_bin 校对规则进行比较。
    gbk_bin 校对规则不忽略大小写,则认为两个字符是不同的,最终输出结果是0。
SELECT CASE WHEN 
'A' COLLATE gbk_bin = 'a' COLLATE gbk_bin
	then 1 
	else 0 
end;

在这里插入图片描述

  • 实例2
    指定“A”和“a”按照 gbk_chinese_ci 校对规则进行比较。
    由于 gbk_chinese_ci 校对规则忽略大小写,所以认为两个“A“和“a”是相同的,最终输出结果是1。
SELECT CASE WHEN 
'A' COLLATE gbk_chinese_ci = 'a' COLLATE gbk_chinese_ci 
	then 1 
	else 0 
end;

在这里插入图片描述

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

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

相关文章

【保姆级图文教程】QT下载、安装、入门、配置VS Qt环境

【保姆级图文教程】QT下载、安装、入门、配置VS Qt环境-CSDN博客 0.QT介绍 QT 是一个跨平台的应用程序开发框架,它提供了丰富的工具和类库,用于开发图形用户界面(GUI)程序。Qt 提供了 C 编程语言接口,同时也支持其他…

考研回顾纪录--科软考研失败并调剂兰州大学软件工程专业复试经历

1.背景 本人工作一年后决定考研,遂于2023年4月底离职。5月到家后开始学习。本科东北大学软件工程专业,绩点3.2/5,按照百分制计算是82分。本科纯属混子,只有一个四级551,一个数学竞赛省二等奖,大创学校立项…

Vue3实战笔记(59)—从零开始掌握Vue3插槽机制,进阶与提高

文章目录 前言一、具名插槽二、高级列表组件示例总结 前言 接上文&#xff0c;接下来看一点稍微复杂的&#xff1a;具名插槽 一、具名插槽 子组件 MyComponent.vue&#xff1a; <template><div><slot name"header"></slot><slot><…

解决ESP-IDF工程里面C/C++找不到路径标红的问题

解决ESP-IDF工程里面C/C找不到路径标红的问题 教程 源文件 打开这一个文件 {"configurations": [{"name": "ESP-IDF","cStandard": "c11","cppStandard": "c17","compileCommands": "…

kafka-生产者拦截器(SpringBoot整合Kafka)

文章目录 1、生产者拦截器1.1、创建生产者拦截器1.2、KafkaTemplate配置生产者拦截器1.3、使用Java代码创建主题分区副本1.4、application.yml配置----v1版1.5、屏蔽 kafka debug 日志 logback.xml1.6、引入spring-kafka依赖1.7、控制台日志 1、生产者拦截器 1.1、创建生产者拦…

Precision和Recall

Precision&#xff08;精确率 / 查准率&#xff09;和 Recall&#xff08;召回率 / 查全率&#xff09;是分类任务中常用的两种性能度量&#xff0c;它们用于评估模型在处理二分类或多分类问题时的表现。 Precision&#xff08;精确率&#xff09; 精确率衡量的是模型预测为正…

linux内存缓存占用过高分析和优化

1、什么是buffer/cache &#xff1f; buffer/cache其实是作为服务器系统的文件数据缓存使用的&#xff0c;尤其是针对进程对文件存在read/write操作的时候&#xff0c;所以当你的服务进程在对文件进行读写的时候&#xff0c;Linux内核为了提高服务的读写速度&#xff0c;则将会…

Redis页面优化

文章目录 1.Redis页面缓存1.思路分析2.首先记录一下目前访问商品列表页的QPS1.线程组配置10000次请求2.请求配置3.开始压测1.压测第一次 平均QPS为6122.压测第二次 平均QPS为6153.压测第三次 平均QPS为617 3.然后记录一下访问商品详情页的QPS1.线程组配置10000次请求2.请求配置…

SwiftUI 利用 Swizz 黑魔法为系统创建的默认对象插入新协议方法(五)

功能需求 在 SwiftUI 的开发中,我们往往需要借助底层 UIKit 的“上帝之手”来进一步实现额外的定制功能。比如,在可拖放(Dragable)SwiftUI 的实现中,会缺失拖放取消的回调方法让我们这些秃头码农们“欲哭无泪” 如上图所示,我们在拖放取消时将界面中的一切改变都恢复如初…

python怎么退出help

Python中查看帮助可以在命令提示行中输入“help()”即可。 如果想要退出帮助&#xff0c;有三种方法&#xff0c;具体如下&#xff1a; 1、直接按键盘上的“enter”键退出帮助。 2、按键盘上的“q”键退出帮助。 3、按键盘上的“CtrlZ”键退出帮助。

带DSP音效处理D类数字功放TAS5805M中文资料

国产替代D类数字功放中文资料访问下方链接 ACM8628 241W立体声182W单通道数字功放中文寄存器表 内置DSP多种音频处理效果ACM8628M-241W立体声或182W单通道数字功放 1 特性 具有增强处理能力和低功率损耗的 TAS5805M 23W、无电感器、数字输入、立体声、闭环 D 类音频放大器 …

AI网络爬虫:用GraphQL查询爬取动态网页数据

任务&#xff1a;爬取网站www.skillshare.com搜索结果页面数据&#xff1a; 查看网站的请求信息&#xff1a; 请求网址: https://www.skillshare.com/api/graphql 请求方法: POST 状态代码: 200 OK 远程地址: 127.0.0.1:10809 引荐来源网址政策: strict-origin-when-…

【微信小程序开发】小程序中的上滑加载更多,下拉刷新是如何实现的?

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

什么是泛洪攻击?DDos攻击也是泛洪攻击的一种?

在数字化时代的浪潮中&#xff0c;网络安全已成为一场没有硝烟的战争。其中&#xff0c;泛洪攻击作为一种常见的网络攻击手段&#xff0c;对个人用户、企业乃至国家网络安全构成了严重威胁。本文将对泛洪攻击进行深入剖析&#xff0c;包括其定义、原理、类型、影响以及应对策略…

计算机基础(5)——进制与进制转换

&#x1f497;计算机基础系列文章&#x1f497; &#x1f449;&#x1f340;计算机基础&#xff08;1&#xff09;——计算机的发展史&#x1f340;&#x1f449;&#x1f340;计算机基础&#xff08;2&#xff09;——冯诺依曼体系结构&#x1f340;&#x1f449;&#x1f34…

用增之Firebase

目录 简介 开发准备&#xff1a; 1、在Firebase平台创建项目 2、将项目关联到应用 3、项目配置 简介 前面讲了google ddl部分&#xff0c;本篇为Firebase的事件上报部分&#xff0c;包括在FireBase平台创建应用 &#xff0c; 如果有用到ddl…

element-plus日历组件el-calendar自定义内容,每天绑定不同的值

效果 代码 <template><el-calendar v-model"calendarDate"><template #date-cell"{ data }"><p :class"data.isSelected ? is-selected : ">{{ data.day.split("-").slice(1).join("-") }}{{ d…

使用Redis常遇到的问题

文章目录 概述缓存雪崩、穿透、击穿大key问题热Key问题缓存和数据库双写一致性问题缓存并发竞争Redis线上阻塞要如何排查Redis 常见的性能问题都有哪些Redis 如何做内存优化Redis数据倾斜 概述 在使用Redis时&#xff0c;有几个常见的问题可能会出现&#xff0c;包括但不限于以…

计算机网络ppt和课后题总结(上)

试在下列条件下比较电路交换和分组交换。要传送的报文共 x(bit)。从源点到终点共经过 k 段链路&#xff0c;每段链路的传播时延为 d(s)&#xff0c;数据率为 b(b/s)。在电路交换时电路的建立时间为 s(s)。在分组交换时分组长度为 p(bit)&#xff0c;且各结点的排队等待时间可忽…

进程同步的基本元素

目录 临界资源 临界区 信号量机制 整形信号量 记录型信号量 AND信号量 信号量集 信号量的应用 实现进程互斥 实现前驱关系 管程机制 总结 临界资源 I/O设备属于临界资源。著名的生产者-消费者问题就是关于临界资源的争夺产生的进程同步的问题。 生产者-消费者 描…