MySQL 下事务的开启、提交、回滚语句应用|学习笔记

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 快速学习 MySQL 下事务的开启、提交、回滚语句应用

开发者学堂课程【MySQL 实操课程MySQL 下事务的开启、提交、回滚语句应用】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/717/detail/12814


MySQL 下事务的开启、提交、回滚语句应用

 

目录:

一、事务应用前期准备工作

二、演示实例

三、事务应用

四、事务回滚

五、事务之隐式提交

六、事务之隐式回滚

 

一、事务应用前期准备工作

1、查看自动提交缺省设置 (MySQL 默认是开启自动提交的)。

2、创建一个用来进行事务测试的表。

3、插入3条测试数据。

show variables like autocommit';

create table user(id int,name varchar(20);

insert into user values(1,zhangsan",(2"lisi'),(3,wangwu');

select * from user;

 

二、演示实例

1、MySQL 默认开启自动提交

(1)连接 RDS 数据库。

选择通过 Cloud Shell 阿里云页面演示。连接 IP:ssh root@47.112.159.55 ,输入密码后回车。连接RDS:[root@i Zwz9bize6nk8hug8j0vywZ ~]# /usr/local/mysql/bin/mysql  -hrm-wz9c2e2q42u426f3z.mysql.rds.aliyuncs.com -uroot -p

回车,显示已经成功连接。

(2)使用创建好的 aliyun 测试数据库

mysql> show databases; // 打开数据库列表;回车看到数据库列表。

图片1.png

mysql> use aliyun;  //使用 aliyun 数据库

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Database changed

mysql> select * from emp; //选择 aliyun 数据库中叫 emp 的表

图片2.png

//看到表中有四条数据。

//查看当前自动提交模式

mysql> show variables like‘%autocommit%'; // 注意 autocommit 中间没有下划线,是连起的。回车,看到默认设置为 ON。

图片3.png

(3)当执行某一条 select,会自动成功的执行。

mysql> update emp set ename=‘zhaoliu’ where id=4;

^c^c -- query aborted   //能自动阻塞

ERROR 1317 (70100): Query execution was inter rupted

mysql> insert into emp (ename hiredate, sal, deptno) values ( ' zhaoliu', 2020-07-18 ,7500,1);  //插入一条数据

Query OK,1 row affected (0.00 sec)  //数据已经写入进去

mysql> select * from emp;    //查询是否成功写入

图片4.png

//看到数据已写入

(4)通过另一个客户端访问 aliyun 数据库查询插入的数据是否成功

mysql> use aliyun ;

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Database changed

mysql> select * from emp;

图片5.png

通过另一个客户端查询看到已经成功写入。

(5)关闭自动执行。把 autocomit 设置为0。

mysql> set autocommit=0;

Query OK, 0 rows affected (0.00 sec)

mysql> show variables like‘%autocommit%’; //查询自动提交变量

图片6.png

结果显示自动执行提交已经关闭。

(6)再插入一条数据

mysql> insert into emp (ename,hiredate,sal,deptno) values (‘andy', 2020-05-18 ,12000,2);

Query OK,1 row affected (0.00 sec)

mysql> select * from emp; //查询数据是否插入成功

图片7.png

可以看到,新增 andy 的数据已经插入到第一个 cloudshell 里了。

(7)在第二个 cloudshell 里查看 andy 的数据是否成功写入

mysql> select * from emp;

图片8.png

看到第二个 cloudshell 里并没有写入 andy 的数据这是因为在第一个 cloudshell里 autocomit 设置为0,已经关闭的默认自动提交。需要手动提交。在第一个cloudshell 里设置:

mysql> commit;  //手动设置提交

Query OK, 0 rows affected (0.00 sec)

再到第二个 cloudshell 里查询 select * from emp; 就能查询到 andy 的数据。

2、创建事务测试表

(1)打开自动提交。在第一个 cloudshell 里设置

mysql> set autocormit=1; //设置 autocormit 1,打开自动提交

Query OK,0 rows affected (0.00 sec)

mysql> show variables like ‘%autocommit% ' ;

图片9.png

自动提交已经打开。在第二个 cloudshell 里也已经打开自动提交

(2)创建测试表。在第一个 cloudshell 里编辑:

mysql> create table user (id int, name varchar (20)) ;

Query OK,0 rows affected (0.02 sec)

mysql> insert into user values (1, 'zhangsan'), (2, 'lisi'), (3, 'wangwu');

Query OK, 3 rows affected (0.00 sec)

Records: 3 Duplicates: 0 Warnings: 0

mysql> select * from user;

图片10.png

确定已经成功插入新增数据。在第二个 cloudshell 里也成功插入。

(3)可以显示的去关闭自动提交。也可以用 begin 的方式关闭自动提交。在第一个 cloudshell 里编辑:

mysql> begin;

Query OK, 0 rows affected (0.00 sec)

mysql> insert into user values (4, 'zhaoliu') :

Query OK,1 row affected (0.00 sec)

mysql> select * from user ;

图片11.png

发现成功插入新增数据。在第二个 cloudshell 里查询却没有插入新增数据zhaoliu。

通过 begin 也会隐式的去开启事务。可以把自动提交手动关闭,另外也可以通过begin 的方式。

(4)回滚

mysql> rollbake;

Query OK, 0 rows affected (0.00 sec)

rollbake 把当前 begin 开启后所有写入的操作回滚到事务开启之前的状态。

(5)开启之前是三条数据,查询

mysql> select * from user ;

图片12.png

看到有变回开始前的三条数据

注意:当执行 rollbake 操作或者 commit 操作时,代表该事务已经结束。

(6)start transaction 和 begin 是等同作用。在第一个 cloudshell 里编辑:

mysql> start transaction;

Query OK, 0 rows affected (0.00 sec)

mysql> insert into user values (4, 'zhaoliu') ;

Query OK,1 row affected (0.00 sec)

mysql> select * from user ;

图片13.png

看到成功插入新数据,共四条数据。

再将其回滚:

mysql> rollbake;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from user ;

查询后又只有三条数据,回到 start transaction 之前的状态。

rollbake 为回滚。要开启新的事务可以通过 begin 或者 start transaction 这两种隐式提交。

(7)注意:begin 或者 start transaction 这两种隐式提交开启事务后会不会把变量 autocommit 关闭了?

mysql> begin;

Query OK,0 rows affected (0.00 sec)

mysql> show variables like‘%tautocommitt%’;

图片14.png

可以看到变量的值并没有改为 false。

mysql> rol1back;

Query OK, 0 rows affected (0.00 sec)

 

三、事务应用

1、分别打开两个 MySQL 客户端 session1 和 session2。

2、session1 开启事务,并插入一条数据,session1 可看到该数据。

#sesssion1

begin;

insert into user values(4,'zhaoliu');

select * from user;

图片15.png

3、Session2 无法看到刚才 session1 插入的数据4 zhaoliu。因 session1 还未手动提交。

#session2

select * from user;

图片16.png

4、session1 客户端提交当前事务。

#sesssion1

commit; //手动执行提交写入操作

5、session2 可以看到刚 session1 插入的数据。因 session1 已提交。

#session2

select * from user;

6、因 MySQL 默认的事务隔离级别是课重复读,故该场景下能看到。

注意:这种情况并不是在所有场景下效果等同。跟事务的隔离级别有关系。

如果把事务的隔离级别改为未提交。那么在 session1 里能看到未提交的数据,在session2 里则不能。

 

四、事务回滚

当关闭 MySQL 的自动提交后,或者开启一个事务后,数据库的开发人员是可以根据需要进行回滚。回滚一般叫撤销,撤销事务开启后的操作。

1、开启事务。

2、插入一条数据。

3、回滚。

4、查询,发现刚插入的数据被回滚了。

begin;

insert into user values(5,'sunqi');

select * from user;

rollback;

select * from user;

 

五、事务之隐式提交

1、当事务提交前执行了 DDL 语句的操作或再次输入 begin 或 start transaction 命令时,会触发隐式提交。

2、演示示例

在第一个 cloudshell 里编辑:

mysql> begin;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from user;

图片17.png

看到三条数据。

mysql> insert into user values (4, 'zhaoliu') ;

Query OK, 1 row affected (0.00 sec)

mysql> select * from user ;

图片18.png

看到四条数据,新增了 zhaoliu。这时,在第二个 cloudshell 里查询不到新增数据zhaoliu。

在第一个 cloudshell 里再次 begin,

mysql> begin;  //再次开启 begin

Query OK, 0 rows affected (0.00 sec)

在第二个 cloudshell 里查询有新增数据 zhaoliu。

在第二次执行 begin 的时候,会把第一次 begin 开启的事务操作进行提交。

也可以多次 rollback。

3、隐式提交语句

(1)直接使用 begin 或 start transaction 命令

(2)使用DDL 语句。如:创建数据库、创建表、创建索引、删除数据库、删除索引、创建存储过程、账号授权等。只要执行 DDL 语句,也会触发隐式提交。

 

六、事务之隐式回滚

1、当前事务提交前退出当前会话、连接操作或者关机情况下,会触发隐式回滚。

2、当执行 exit 退出 mysql 客户端后,重新进入查询,发现刚插入的数据并未成功插入

3、演示示例

在第一个 cloudshell 里编辑:

mysql> begin;

Query OK, 0 rows affected (0.00 sec)

mysql> insert into user values (5, 'sunqi');

Query OK,1 row affected (0.00 sec)

在第二个 cloudshell 里查询不到新增数据 sunqi。

在第一个 cloudshell 里执行退出:

mysql> exit  // 退出

Bye

[root@iZwz9bize6nk8hug8j0vywZ ~]#/usr/1ocal/mysq1/bin/ mysql -hrm-wz9c2e2q42u426f3z ,mysql . rds . aliyuncs .com -uroot -P

Enter password:

……

再到第二个 cloudshell 里查询仍旧没有新增数据 sunqi。

没有手动提交,数据 sunqi 则没有写入进去。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
25天前
|
SQL 监控 关系型数据库
MySQL怎么全局把一张表的数据回滚
MySQL怎么全局把一张表的数据回滚
66 2
|
18天前
|
存储 SQL 关系型数据库
Mysql学习笔记(二):数据库命令行代码总结
这篇文章是关于MySQL数据库命令行操作的总结,包括登录、退出、查看时间与版本、数据库和数据表的基本操作(如创建、删除、查看)、数据的增删改查等。它还涉及了如何通过SQL语句进行条件查询、模糊查询、范围查询和限制查询,以及如何进行表结构的修改。这些内容对于初学者来说非常实用,是学习MySQL数据库管理的基础。
74 6
|
8天前
|
存储 关系型数据库 MySQL
MySQL在企业内部应用场景有哪些
【10月更文挑战第17天】MySQL在企业内部应用场景有哪些
18 0
|
8天前
|
存储 关系型数据库 MySQL
介绍一下MySQL的一些应用场景
【10月更文挑战第17天】介绍一下MySQL的一些应用场景
42 0
|
8天前
|
存储 SQL 关系型数据库
MySQL的事务隔离级别
【10月更文挑战第17天】MySQL的事务隔离级别
83 43
|
18天前
|
SQL 关系型数据库 MySQL
Mysql学习笔记(三):fetchone(), fetchmany(), fetchall()详细总结
MySQL中用于数据检索的`fetchone()`, `fetchmany()`, `fetchall()`函数的功能、SQL语句示例和应用场景。
37 3
Mysql学习笔记(三):fetchone(), fetchmany(), fetchall()详细总结
|
18天前
|
SQL Ubuntu 关系型数据库
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
本文为MySQL学习笔记,介绍了数据库的基本概念,包括行、列、主键等,并解释了C/S和B/S架构以及SQL语言的分类。接着,指导如何在Windows和Ubuntu系统上安装MySQL,并提供了启动、停止和重启服务的命令。文章还涵盖了Navicat的使用,包括安装、登录和新建表格等步骤。最后,介绍了MySQL中的数据类型和字段约束,如主键、外键、非空和唯一等。
57 3
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
|
2天前
|
SQL 关系型数据库 MySQL
mysql数据误删后的数据回滚
【11月更文挑战第1天】本文介绍了四种恢复误删数据的方法:1. 使用事务回滚,通过 `pymysql` 库在 Python 中实现;2. 使用备份恢复,通过 `mysqldump` 命令备份和恢复数据;3. 使用二进制日志恢复,通过 `mysqlbinlog` 工具恢复特定位置的事件;4. 使用延迟复制从副本恢复,通过停止和重启从库复制来恢复数据。每种方法都有详细的步骤和示例代码。
|
21天前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1585 14
|
14天前
|
SQL 关系型数据库 MySQL
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
尼恩,一位40岁的资深架构师,通过其丰富的经验和深厚的技術功底,为众多读者提供了宝贵的面试指导和技术分享。在他的读者交流群中,许多小伙伴获得了来自一线互联网企业的面试机会,并成功应对了诸如事务ACID特性实现、MVCC等相关面试题。尼恩特别整理了这些常见面试题的系统化解答,形成了《MVCC 学习圣经:一次穿透MYSQL MVCC》PDF文档,旨在帮助大家在面试中展示出扎实的技术功底,提高面试成功率。此外,他还编写了《尼恩Java面试宝典》等资料,涵盖了大量面试题和答案,帮助读者全面提升技术面试的表现。这些资料不仅内容详实,而且持续更新,是求职者备战技术面试的宝贵资源。
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?