9. MySQL事务、字符集

文章目录

  • 【 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_binthen 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.rhkb.cn/news/341219.html

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

相关文章

MySQL—多表查询(概述、基本实操、分类)

一、引言 概述:指的是从多张表中查询数据。 二、实操 打开 DataGrip 进行尝试多表查询。 (1)表结构的准备以及数据的插入 分别是:员工表 emp 以及 部门表。员工表中字段 dept_id 是外键,关联部门表的主键 id。 em…

ARP欺骗的原理与详细步骤

ARP是什么: 我还记得在计算机网络课程当中,学过ARP协议,ARP是地址转换协议,是链路层的协议,是硬件与上层之间的接口,同时对上层提供服务。在局域网中主机与主机之间不能直接通过IP地址进行通信&#xff0c…

先进制造aps专题十一 国内软件/erp行业的现状及对aps行业的启示

看到一个帖子 中国软件行业几乎全军覆没 OSC开源社区 2024-06-03 15:58 广东 刚刚网上冲浪刷到的 网友锐评:都是客户关系型公司。 知名大 V 「Fenng」评论称: 这里所谓的软件行业公司如果立刻倒闭,才能够利好中国整个行业软件生态。有个网…

electron初学

最近有一个开发桌面端的业务,考虑到跨平台就使用了electron。 引用官网:Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows…

[线程与网络] 网络编程与通信原理(四):深入理解传输层UDP与TCP协议

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏:🍕 Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 🧀Java …

WWDC 2024前瞻:苹果如何用AI技术重塑iOS 18和Siri

苹果下周的全球开发者大会有望成为这家 iPhone 制造商历史上的关键时刻。在 WWDC 上,这家库比蒂诺科技巨头将展示如何选择将人工智能技术集成到其设备和软件中,包括通过与 OpenAI 的历史性合作伙伴关系。随着重大事件的临近,有关 iOS 18 及其…

使用Rufus工具制作Ubuntu To Go——很详细

一、准备工作 准备工具: 1、下载Rufus(主角)软件 2、准备一个U盘或硬盘(小白128G足够,装Ubuntu系统) 3、下载Ubuntu系统镜像文件 1、下载软件Rufus 先来看一下官网介绍: Rufus 是一款格式化和创建 USB 启动盘的辅助工…

探索 Omost:创新的图像生成AI框架

文章目录 探索 Omost:创新的图像生成AI框架第一部分:背景第二部分:Omost是什么?第三部分:如何安装Omost?第四部分:结合具体场景使用第五部分:总结 探索 Omost:创新的图像…

大话设计模式学习笔记

目录 工厂模式策略模式备忘录模式(快照模式)代理模式单例模式迭代器模式访问者模式观察者模式解释器模式命令模式模板方法模式桥接模式适配器模式外观模式享元模式原型模式责任链模式中介者模式装饰模式状态模式 工厂模式 策略模式 核心:封装…

神经网络 | 深度学习背后的数学

神经网分析 机器学习处理的是数据,通过学习输入的数据,从而建立模型,以便预测新的数据的输出 按照类型可以进行如下分类 监督分类 非监督分类 强化学习 神经元 生物学中,人的大脑是由多个神经元互相连接形成网络而构成的。也…

处理无法拉取GitHub库的解决方案

提交和拉取github上的库总是失败,这里记录一下如何使用代理解决。 首先找到端口,记住它的端口 然后使用git命令 # HTTP/HTTPS 协议 git config ––global http.url.proxy http://127.0.0.1:port # 以 Github 为例 git config ––global http.https:/…

四.再谈协议_网络计算器

序言 在之前章节中,我们认识了一些网络的接口,并简单体验了一下网络编程,成功实现了字符串数据的收发,模拟实现了最基本的一个多人聊天室,但是网络编程就仅仅局限于此吗?那还远远不够! 最基本的一点在于&…

ChatGPT Edu版本来啦:支持GPT-4o、自定义GPT、数据分析等

5月31日,OpenAI在官网宣布,推出ChatGPT Edu版本。 据悉,这是一个专门为大学校园提供的ChatGTP,支持GPT-4o、网络搜索、自定义GPT、数据分析、代码生成等功能,可以极大提升学生、老师的学习质量和教学效率。 目前&…

Mac OS 用户开启 8080 端口

开启端口 sudo vim /etc/pf.conf # 开放对应端口 pass out proto tcp from any to any port 8080 # 刷新配置文件 sudo pfctl -f /etc/pf.conf sudo pfctl -e获取本机ip地址 ifconfig en0 | grep inet | grep -v inet6 | awk {print $2}访问指定端口

星创编辑器在投放业务中的落地|得物技术

搭建一个落地页需要涉及到多方合作,需要不断地进行沟通协调。繁杂的流程需要耗费很多的时间,因此我们推动产品重新搭建了一个专门服务于软广投放流程的编辑器——星创,完成广告搭建在投放业务各系统中的闭环。 一、落地页技术架构 名词解释…

贰[2],VisionMaster/.NetCore的WPF应用程序调用控件

1,环境 VisionMaster4.2 VisualStudio2022 WPF/.Net6.0 2,记录原因 .NetFrameWork的WPF应用程序调用添加例程.NetFrameWork的Winform应用程序相应的库,不会出现报错,界面也能正常显示操作,但是.NetCore的程序却总是报错。 2.1,.NetFrameWork的WPF应用程序 注:但是.…

AI绘画SD入门教程:ControlNet篇-Canny边缘检测预处理器

大家好,我是向阳 在本篇中,我来讲讲如何使用预处理器和辅助模型,分别都有些什么作用。 💡 这里说明一下当你调用预处理器而辅助模型显示为无的几种原因: 当已载入SD1.5的模型时,CannyXL的辅助模型不会显示…

【笔记】Sturctured Streaming笔记总结(Python版)

目录 相关资料 一、概述 1.1 基本概念 1.2 两种处理模型 (1)微批处理 (2)持续处理 1.3 Structured Streaming和Spark SQL、Spark Streaming关系 二、编写Structured Streaming程序的基本步骤 三、输入源 3.1 File源 &a…

django 内置 JSON 字段 使用场景

Django 内置的 JSON 字段(JSONField)是在 Django 3.1 版本中引入的,用于处理 JSON 格式的数据。JSONField 允许在数据库表中存储和查询 JSON 数据,并且在与 Python 代码交互时自动转换为合适的 Python 数据类型。以下是一些常见的…

【golang学习之旅】Go中的cron定时任务

系列文章 【golang学习之旅】报错:a declared but not used 【golang学习之旅】Go 的基本数据类型 【golang学习之旅】深入理解字符串string数据类型 【golang学习之旅】go mod tidy 【golang学习之旅】记录一次 panic case : reflect: reflect.Value.SetInt using…