MySQL进阶(再论事务)——什么是事务 & 事务的隔离级别 & 结合MySQL案例详细分析

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新软件测试全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注软件测试)
img

正文

引出


1.事务(TRANSACTION)是一个不可分割的逻辑单元,包含了一组数据库操作命令,并且把所有的命令作为一个整体向系统提交,要么都执行、要么都不执行;

2.隔离级别和脏读、不可重复读以及幻象读的对应关系如下:

隔离级别脏读不可重复读幻读
READ UNCOMMITTED允许允许允许
READ COMMITED不允许允许允许
REPEATABLE READ 【默认的隔离级别】不允许不允许允许
SERIALIZABLE不允许不允许不允许

3.在MySQL数据库中,默认的事务隔离级别是REPEATABLE READ 可重复读;

一、什么是事务

事务(TRANSACTION)是一个不可分割的逻辑单元,包含了一组数据库操作命令,并且把所有的命令作为一个整体向系统提交,要么都执行、要么都不执行。

二、事务的特性

事务必须具备以下四个属性,简称ACID 属性

1、原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么全部成功,要么全部失败。
比如在同一个事务中的SQL语句,要么全部执行成功,要么全部执行失败。

2、一致性(Consistency)
事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

换一种方式理解就是:事务按照预期生效,数据的状态是预期的状态。
比如账户A和账户B两者的余额加起来总共是5000,那么不管A和B之间如何转账,转账几次,事务结束后两个账户的钱相加起来最终还是5000。

3、隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间,要相互隔离。
在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同,分别是:未授权读取,授权读取,可重复读取和串行化。

4、持久性(durability)
一旦事务提交,那么数据的状态就会被永久的保存到数据库中。
即使发生系统崩溃或机器宕机等故障,只要数据库能够重新启动,那么一定能够将其恢复到事务成功结束的状态。

三、事务的使用步骤

1、开始事务

BEGIN ;
或START TRANSACTION;

2、提交事务

COMMIT ;

3、回滚(撤销)事务

ROLLBACK ;

五、SQL实战

使用事务有两种方式,分别为显式事务隐式事务

1、显式事务

(1)创建account表,并插入测试数据

在这里插入图片描述

create table account(
id int primary key auto_increment,
name varchar(20) unique not null,
balance int
);

insert into account values(null,‘zs’,1000);
insert into account values(null,‘lisi’,1);

在这里插入图片描述

commit之后数据才提交

在这里插入图片描述

事物回滚,删除一条数据进行测试

在这里插入图片描述

回滚

在这里插入图片描述

BEGIN;
delete from account where name=‘zs’;

ROLLBACK

保存点SAVEPOINT

在事务中创建保存点,方便后续针对保存点进行回滚。一个事务中可以存在多个保存点。

在这里插入图片描述

回滚到指定位置

在这里插入图片描述

begin;
delete from account where name=‘zs’;
savepoint first;
delete from account where name=‘lisi’;

ROLLBACK TO first;
COMMIT

2、隐式事物

DROP TABLE account;
create table account(
id int primary key auto_increment,
name varchar(20) unique not null,
balance int
);

insert into account values(null,‘zs’,1000);
insert into account values(null,‘lisi’,1);

(1)在MySQL中执行DML语句,会自动提交事物。

delete from account where name=‘zs’;

在这里插入图片描述

(2)MySQL中有一个系统变量 autocommit, 可以查看是否开启自动提交事物。

SHOW VARIABLES LIKE ‘autocommit’;

(3)把系统变量autocommit 的值设置为 OFF ,则会关闭自动提交。

SET autocommit = OFF;
#或
SET autocommit = 0;

在这里插入图片描述

(4)再次执行DML语句,发现不会自动提交。

insert into account values(null,‘zs’,1000);

在这里插入图片描述

(5)此时必须显示的提交事物才能生效

commit;

在这里插入图片描述

六、事务的隔离级别

1、理论

MySQL 中事务的隔离级别一共分为四种,分别如下:

  • 序列化(SERIALIZABLE)
  • 可重复读(REPEATABLE READ)
  • 提交读(READ COMMITTED)
  • 未提交读(READ UNCOMMITTED)
时刻事务1事务2
T0读取商品初始库存为2
T1扣减库存,库存为1
T2读取商品库存为1
T3回滚事务,库存为2
T4扣减库存,提交事务
T5查询库存为1

在MySQL数据库中,默认的事务隔离级别是REPEATABLE READ 可重复读

2、查看事务的隔离级别

通过如下 SQL 可以查看数据库实例默认的全局隔离级别和当前 session 的隔离级别。

(1)MySQL8 之前使用如下命令查看 MySQL 隔离级别:

SELECT @@GLOBAL.tx_isolation, @@tx_isolation;

(2)MySQL8 开始,通过如下命令查看 MySQL 默认隔离级别

SELECT @@GLOBAL.transaction_isolation, @@transaction_isolation;

在这里插入图片描述

(3)通过如下命令可以修改隔离级别(建议修改当前 session 隔离级别即可,不用修改全局的隔离级别):

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

上面这条 SQL 表示将当前 session 的数据库隔离级别设置为 READ UNCOMMITTED,设置成功后,再次查询隔离级别,发现当前 session 的隔离级别已经变了。

在这里插入图片描述

注意,如果只是修改了当前 session 的隔离级别,则换一个 session 之后,隔离级别又会恢复到默认的隔离级别,所以我们测试时,修改当前 session 的隔离级别即可。

七、READ UNCOMMITTED 未提交读

该事物隔离级别会导致出现脏读、不可重复读、幻读。

1、准备测试数据

DROP TABLE account;
create table account(
id int primary key auto_increment,
name varchar(20) unique not null,
balance int
);

insert into account values(null,‘zs’,1000);
insert into account values(null,‘lisi’,1);

在这里插入图片描述

2、脏读

一个事务读到另外一个事务还没有提交的数据,称之为脏读。具体操作如下

会话A

START TRANSACTION;

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
在这里插入图片描述

2、脏读

一个事务读到另外一个事务还没有提交的数据,称之为脏读。具体操作如下

会话A

START TRANSACTION;

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)
[外链图片转存中…(img-aXE6CaCX-1713339097593)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 26
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值