MySQL进阶:MySQL事务(实践二)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL 事务主要用于处理操作量大,复杂度高的数据。比方我想要删除一个用户(销户)以及这个用户的个人信息、订单信息以及其他信息,这里会涉及到很多SQL语句的执行来满足我们的业务需求,我们要一次性删除这些数据,这些数据库操作语句就构成了一个事务。 那么在MySQL数据库中,我们如何查看存储引擎是否支持事务呢?下面我就从我实验机器上的MySQL来一探究竟。

上一个章节说了什么是事务,在MySQL数据库中如何查询事务,以及哪些存储引擎支持事务。这一章节来说说事务的隔离。


1.1 隔离的设计

事务隔离是数据库处理的基础之一。隔离级别是在多个事务同时进行更改和执行查询时微调性能与结果的可靠性、一致性和可再现性之间的平衡的设置。所以软件在设计之初考虑到大多数使用场景可以通用的情况,就针对这些做了最平衡的处理。


1.2 隔离的级别

从MySQL的官方网站,我们可以查询到MySQL中有四种隔离级别,他们执行的是InnoDB提供 SQL:1992 标准,他们分别是:

  • READ UNCOMMITTED:读未提交。在该隔离级别下,所有事务都可以看到其他未提交事务的执行结果。不能避免脏读、不可重复读、幻读。
  • READ COMMITTED:读已提交。在该隔离级别下,一个事务只能看见已经提交事务所做 的改变。这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。可以避免脏读,但不可 重复读、幻读问题仍然存在。
  • REPEATABLE READ(default):可重复读。MySQL的默认隔离级别,在该隔离级别下,可以避免脏读、不可重复读,但幻读问题仍 然存在。
  • SERIALIZABLE:可序列化。在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除操作。所有的并发问题都可以避免,但性能十分低下。能避 免脏读、不可重复读和幻读。


隔离级别所能解决的问题如下:


1.3 事务在MySQL语句中使用

「开启事务」

BEGIN 或 START TRANSACTION ;


「提交事务」

COMMIT 也可以使用 COMMIT WORK,不过二者是等价的。COMMIT 会提交事务,并使已对数据库进行的所有修改成为永久性的;


「回滚事务」

ROLLBACK 也可以使用 ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;


「创建保存点」

SAVEPOINT identifier,SAVEPOINT 允许在事务中创建一个保存点,一个事务中可以有多个 SAVEPOINT;


「删除事务保存点」

RELEASE SAVEPOINT identifier 删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;


「回滚到标记点」

ROLLBACK TO identifier 把事务回滚到标记点;


「设置事务隔离级别」

SET TRANSACTION 用来设置事务的隔离级别。InnoDB 存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。


注意⚠️:具体的事务使用可以参考下官方提供的说明文档:自动提交、提交和回滚


1.4 如何查询当前服务器的事务

下面在我实验环境下,使用两种方式来查看事务。


「方式一」不区分大小写

show variables like 'transaction_isolation';


「方式二」不区分大小写

SELECT @@transaction_isolation;

当然,我们还可以从可视化工具中查询。


1.5 如何设置和使用事务隔离级别


「设置全局变量」其实就是设置一个全局变量。

-- 方式一

SET [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL '[READ-UNCOMMITTED|READ-COMMITTED|REPEATABLE-READ|SERIALIZABLE]'


-- 方式二

SET [GLOBAL|SESSION] TRANSACTION_ISOLATION = '[READ-UNCOMMITTED|READ-COMMITTED|REPEATABLE-READ|SERIALIZABLE]'


「开始执行1.3所列步骤」

在默认不修改事务隔离级别的情况,在MySQL服务器使用命令行实验下。

  • 开启事务、回滚事务
mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> show tables;
+-----------------------------+| Tables_in_study             |
+-----------------------------+| table1                      |
| table2                      |
| tb                          |
| test_01                     |
+-----------------------------+29 rows inset (0.00 sec)
mysql>
mysql> select * from table1 ;
+----+----------+| id | col_name |
+----+----------+|  1 | 张三1    |
|  2 | 张三2    |
|  3 | 张三3    |
|  4 | 张三4    |
|  5 | 张三5    |
|  6 | 李四1    |
|  7 | 李四2    |
|  8 | 李四3    |
|  9 | 李四4    |
| 10 | 李四5    |
+----+----------+10 rows inset (0.00 sec)
mysql>
mysql> delete from table1 where id =6;
Query OK, 1 row affected (0.00 sec)
mysql>
mysql> rollback;
Query OK, 0 rows affected (0.01 sec)
mysql>
mysql> select * from table1 ;
+----+----------+| id | col_name |
+----+----------+|  1 | 张三1    |
|  2 | 张三2    |
|  3 | 张三3    |
|  4 | 张三4    |
|  5 | 张三5    |
|  6 | 李四1    |
|  7 | 李四2    |
|  8 | 李四3    |
|  9 | 李四4    |
| 10 | 李四5    |
+----+----------+10 rows inset (0.00 sec)


  • 插入数据未提交
mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> select * from table1 ;
+----+----------+| id | col_name |
+----+----------+|  1 | 张三1    |
|  2 | 张三2    |
|  3 | 张三3    |
|  4 | 张三4    |
|  5 | 张三5    |
|  6 | 李四1    |
|  7 | 李四2    |
|  8 | 李四3    |
|  9 | 李四4    |
| 10 | 李四5    |
+----+----------+10 rows inset (0.00 sec)
mysql>
mysql> insert into table1(id, col_name) values(100, "测试100"), (110, "测试110");
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0mysql>
mysql> select * from table1 ;
+-----+-----------+| id  | col_name  |
+-----+-----------+|   1 | 张三1     |
|   2 | 张三2     |
|   3 | 张三3     |
|   4 | 张三4     |
|   5 | 张三5     |
|   6 | 李四1     |
|   7 | 李四2     |
|   8 | 李四3     |
|   9 | 李四4     |
|  10 | 李四5     |
| 100 | 测试100   |
| 110 | 测试110   |
+-----+-----------+12 rows inset (0.00 sec)
mysql>


  • 提交后再查询
mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> select * from table1 ;
+----+----------+| id | col_name |
+----+----------+|  1 | 张三1    |
|  2 | 张三2    |
|  3 | 张三3    |
|  4 | 张三4    |
|  5 | 张三5    |
|  6 | 李四1    |
|  7 | 李四2    |
|  8 | 李四3    |
|  9 | 李四4    |
| 10 | 李四5    |
+----+----------+10 rows inset (0.00 sec)
mysql>
mysql>
mysql> insert into table1(id, col_name) values(100, "测试100"), (110, "测试110");
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0mysql>
mysql> select * from table1 ;
+-----+-----------+| id  | col_name  |
+-----+-----------+|   1 | 张三1     |
|   2 | 张三2     |
|   3 | 张三3     |
|   4 | 张三4     |
|   5 | 张三5     |
|   6 | 李四1     |
|   7 | 李四2     |
|   8 | 李四3     |
|   9 | 李四4     |
|  10 | 李四5     |
| 100 | 测试100   |
| 110 | 测试110   |
+-----+-----------+12 rows inset (0.00 sec)
mysql>
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> select * from table1 ;
+-----+-----------+| id  | col_name  |
+-----+-----------+|   1 | 张三1     |
|   2 | 张三2     |
|   3 | 张三3     |
|   4 | 张三4     |
|   5 | 张三5     |
|   6 | 李四1     |
|   7 | 李四2     |
|   8 | 李四3     |
|   9 | 李四4     |
|  10 | 李四5     |
| 100 | 测试100   |
| 110 | 测试110   |
+-----+-----------+12 rows inset (0.00 sec)


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
安全 关系型数据库 MySQL
PHP与MySQL交互:从入门到实践
【9月更文挑战第20天】在数字时代的浪潮中,掌握PHP与MySQL的互动成为了开发动态网站和应用程序的关键。本文将通过简明的语言和实例,引导你理解PHP如何与MySQL数据库进行对话,开启你的编程之旅。我们将从连接数据库开始,逐步深入到执行查询、处理结果,以及应对常见的挑战。无论你是初学者还是希望提升技能的开发者,这篇文章都将为你提供实用的知识和技巧。让我们一起探索PHP与MySQL交互的世界,解锁数据的力量!
|
1月前
|
存储 SQL 关系型数据库
MySQL的事务隔离级别
【10月更文挑战第17天】MySQL的事务隔离级别
98 43
|
15天前
|
关系型数据库 MySQL Linux
Linux环境下MySQL数据库自动定时备份实践
数据库备份是确保数据安全的重要措施。在Linux环境下,实现MySQL数据库的自动定时备份可以通过多种方式完成。本文将介绍如何使用`cron`定时任务和`mysqldump`工具来实现MySQL数据库的每日自动备份。
37 3
|
14天前
|
存储 监控 关系型数据库
MySQL自增ID耗尽解决方案:应对策略与实践技巧
在MySQL数据库中,自增ID(AUTO_INCREMENT)是一种特殊的属性,用于自动为新插入的行生成唯一的标识符。然而,当自增ID达到其最大值时,会发生什么?又该如何解决?本文将探讨MySQL自增ID耗尽的问题,并提供一些实用的解决方案。
24 1
|
29天前
|
NoSQL 关系型数据库 MySQL
MySQL与Redis协同作战:百万级数据统计优化实践
【10月更文挑战第21天】 在处理大规模数据集时,传统的单体数据库解决方案往往力不从心。MySQL和Redis的组合提供了一种高效的解决方案,通过将数据库操作与高速缓存相结合,可以显著提升数据处理的性能。本文将分享一次实际的优化案例,探讨如何利用MySQL和Redis共同实现百万级数据统计的优化。
75 9
|
1月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1642 14
|
1月前
|
SQL 关系型数据库 MySQL
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
尼恩,一位40岁的资深架构师,通过其丰富的经验和深厚的技術功底,为众多读者提供了宝贵的面试指导和技术分享。在他的读者交流群中,许多小伙伴获得了来自一线互联网企业的面试机会,并成功应对了诸如事务ACID特性实现、MVCC等相关面试题。尼恩特别整理了这些常见面试题的系统化解答,形成了《MVCC 学习圣经:一次穿透MYSQL MVCC》PDF文档,旨在帮助大家在面试中展示出扎实的技术功底,提高面试成功率。此外,他还编写了《尼恩Java面试宝典》等资料,涵盖了大量面试题和答案,帮助读者全面提升技术面试的表现。这些资料不仅内容详实,而且持续更新,是求职者备战技术面试的宝贵资源。
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
|
1月前
|
SQL 关系型数据库 MySQL
【MySQL】索引和事务
【MySQL】索引和事务
55 0
|
1月前
|
消息中间件 监控 关系型数据库
MySQL数据实时同步到Elasticsearch:技术深度解析与实践分享
在当今的数据驱动时代,实时数据同步成为许多应用系统的核心需求之一。MySQL作为关系型数据库的代表,以其强大的事务处理能力和数据完整性保障,广泛应用于各种业务场景中。然而,随着数据量的增长和查询复杂度的提升,单一依赖MySQL进行高效的数据检索和分析变得日益困难。这时,Elasticsearch(简称ES)以其卓越的搜索性能、灵活的数据模式以及强大的可扩展性,成为处理复杂查询需求的理想选择。本文将深入探讨MySQL数据实时同步到Elasticsearch的技术实现与最佳实践。
103 0
|
2月前
|
SQL Oracle 关系型数据库
详解 MySQL 的事务以及隔离级别
详解 MySQL 的事务以及隔离级别
43 0
下一篇
无影云桌面