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

总结

其他的内容都可以按照路线图里面整理出来的知识点逐一去熟悉,学习,消化,不建议你去看书学习,最好是多看一些视频,把不懂地方反复看,学习了一节视频内容第二天一定要去复习,并总结成思维导图,形成树状知识网络结构,方便日后复习。

这里还有一份很不错的《Java基础核心总结笔记》,特意跟大家分享出来

目录:

部分内容截图:

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

事务必须具备以下四个属性,简称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;
UPDATE account set balance = balance -1 WHERE name = 'lisi'

会话B

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT @@GLOBAL.transaction\_isolation, @@transaction\_isolation;

SELECT \* FROM account

在这里插入图片描述

可以看到,A 窗口中的事务,虽然还未提交,但是 B 窗口中已经可以查询到数据的相关变化了。

这就是脏读问题。

3、不可重复读

不可重复读是指一个事务先后读取同一条记录,但两次读取的数据结果不同,称之为不可重复读。

在这里插入图片描述

-- 会话A
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
START TRANSACTION;
SELECT \* FROM account WHERE name ='lisi';
SELECT SLEEP(10);
SELECT \* FROM account WHERE name ='lisi';
COMMIT;

-- 会话B
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

START TRANSACTION;
UPDATE account SET balance =  balance -500 WHERE name ='lisi';
COMMIT;


最后总结

ActiveMQ+Kafka+RabbitMQ学习笔记PDF

image.png

  • RabbitMQ实战指南

image.png

  • 手写RocketMQ笔记

image.png

  • 手写“Kafka笔记”

image

关于分布式,限流+缓存+缓存,这三大技术(包含:ZooKeeper+Nginx+MongoDB+memcached+Redis+ActiveMQ+Kafka+RabbitMQ)等等。这些相关的面试也好,还有手写以及学习的笔记PDF,都是啃透分布式技术必不可少的宝藏。以上的每一个专题每一个小分类都有相关的介绍,并且小编也已经将其整理成PDF啦

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

028)]

  • 手写“Kafka笔记”

[外链图片转存中…(img-HfpXRLoO-1715460115029)]

关于分布式,限流+缓存+缓存,这三大技术(包含:ZooKeeper+Nginx+MongoDB+memcached+Redis+ActiveMQ+Kafka+RabbitMQ)等等。这些相关的面试也好,还有手写以及学习的笔记PDF,都是啃透分布式技术必不可少的宝藏。以上的每一个专题每一个小分类都有相关的介绍,并且小编也已经将其整理成PDF啦

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 28
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值