首页 > 数据库 >MySQL脏读的演示

MySQL脏读的演示

时间:2024-11-18 19:06:58浏览次数:1  
标签:set 演示 隔离 read isolation 脏读 MySQL 窗口 级别

MySQL脏读的演示

1.查询和设置隔离级别

show variables like '%isolation%';
-- 或
select @@tx_isolation;

2.设置事务隔离级别

需要退出MySQL再进入MySQL才能看到隔离级别的变化

set global transaction isolation level 隔离级别;

安全性:serializable > repeatable read > read committed > read uncommitted

性能 : serializable < repeatable read < read committed < read uncommitted

set global transaction isolation level read uncommitted;
set global transaction isolation level repeatable read;

注意,mysql5.6后如果将隔离级别设置uncommitted,那么修改数据会报错,

所以我们在演示的时候,针对当前会话设置如下:

# 设置session级别的BINLOG  
SET SESSION binlog_format = 'MIXED' ;

上述命令只是当前会话有效,重新连接失效,通过如下命令可以查看:

#查看binlog方式      
mysq

3.脏读的演示

脏读:一个事务读取到了另一个事务中尚未提交的数据。

打开一个窗口,设置为A窗口,登录MySQL,设置全局的隔离级别为最低

-- 设置窗口名字A
title A
-- 登录mysql数据库
mysql -u root -P 3309 -p
******
-- 设置事务隔离级别
set global transaction isolation level read uncommitted;

注意:设置事务隔离级别,需要重新打开一个窗口才能看到隔离级别的变化.

重新打开一个新的窗口,设置为B窗口,登录MySQL

-- 设置窗口名字B
title B
-- 登录mysql数据库
mysql -u root -P 3309 -p
******
-- 查询隔离级别
select @@tx_isolation;

3.AB窗口都开启事务

4.A窗口更新2个人的账户数据,未提交

update tb_account set money=money-500 where id=1;
update tb_account set money=money+500 where id=2;

5.B窗口查询账户

select *from tb_account;

显然 B已经读到了A尚未提交的数据

6.A窗口回滚

rollback;

7.B窗口查询账户,钱没了

select *from tb_account;

脏读非常危险的,假设我是淘宝阿里后台工程师 我有这个权限,我开启事务, 我双十一在淘宝买了一把阿米洛的键盘,向商家付款700元,商家一看,钱到账了,随后商家开始发货,我收到货后回滚事务,商家一看,XX,钱没了,

解决脏读的问题:将全局的隔离级别进行提升

在A窗口设置全局的隔离级别为read committed

set global transaction isolation level read committed;

B窗口退出MySQL,B窗口再进入MySQL

AB窗口同时开启事务

A更新2个人的账户,未提交

update tb_account set money=money-500 where id=1;
update tb_account set money=money+500 where id=2;

B窗口查询账户

可以看到 B没有读取到A未提交的数据

A窗口commit提交事务

B窗口查看账户

可以看到 但A提交后 B能成功读取提交后的数据

结论:read committed的方式可以避免脏读的发生

小结

  1. 查询全局事务隔离级别?
   show variables like '%isolation%';
   select @@tx_isolation;
  1. 设置全局事务隔离级别?
set global transaction isolation level 隔离级别字符串;
set global transaction isolation level repeatable read;
  1. 如何解决赃读?
    将隔离级别设置为:read committed

标签:set,演示,隔离,read,isolation,脏读,MySQL,窗口,级别
From: https://www.cnblogs.com/itcq1024/p/18553451

相关文章

  • 安装MySQL8数据库
    安装MySQL8MySQLCommunityServer社区版本,开源免费,自由下载,但不提供官方技术支持,适用于大多数普通用户。MySQLEnterpriseEdition企业版本,需付费,不能在线下载,可以试用30天。提供了更多的功能和更完备的技术支持,更适合于对数据库的功能和可靠性要求较高的企业客户。MySQLCl......
  • 记录一些旧版本 MySQL 的问题与处理
    旧版本相关资源下载:https://downloads.mysql.com/archives/(以下版本号均为实测版本号,不代表同大版本下的其它小版本行为也会一致)1、MySQL5.1.46版本-使用命令或服务运行数据库时,不需要也不支持通过参数初始化数据库(下载的压缩包内已有初始数据)-默认的root用户密码为空,所......
  • 深入理解MySQL事务:原理、应用与实践(下)
    深入理解MySQL事务:原理、应用与实践(下)事务的四大特征事务的四大特性(ACID)(面试)数据库的事务必须具备ACID特性,ACID是指Atomicity(原子性)、Consistensy(一致性)、Isolation(隔离性)和Durability(持久性)的英文缩写。1.原子性(Atomicity)原子性是事务的四大特性(ACID)之一,它确保事务包......
  • centos7安装mysql8
    1、更新:sudoyumupdate2、添加MySQLYum存储库:sudorpm-Uvhhttps://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm3、安装MySQL:  sudoyuminstallmysql-server若安装过程中会报错: Failingpackageis:mysql-community-client-8.0.39-1.el7.x86_......
  • 基于python在线考试统计系统(Pycharm Flask Django mysql)
    文章目录项目介绍系统开发技术路线具体实现截图开发技术系统性能核心代码部分展示源码/演示视频获取方式项目介绍系统主要包括首页、个人中心、学生管理、教师管理、班级管理、班级公告管理、考试通知管理、统计成绩管理、留言信息管理、教师评论管理、试题管理、论......
  • 【MySQL】库的基础操作入门指南
    ......
  • MySQL45讲 第二十五讲 高可用性深度剖析:从主备原理到策略选择
    文章目录MySQL45讲第二十五讲高可用性深度剖析:从主备原理到策略选择一、MySQL主备基础原理(一)主备关系与数据同步(二)主备切换流程二、主备延迟分析(一)主备延迟的定义与计算(二)主备延迟的来源三、主备切换策略(一)可靠性优先策略(二)可用性优先策略(三)策略选择的权衡四、异常......
  • pymysql 工具类
    #!/usr/bin/envpython3#-*-coding:utf-8-*-"""pipinstallpymsql"""importpymysqlimportloggingclassSQLException(BaseException):passclassMySQLOperation(object):def__init__(self,host,username,pass......
  • 深入理解MySQL事务:原理、应用与实践(上)
    事务的应用场景说明在实际生活中,事务在处理复杂的业务逻辑时显得尤为重要。以下是两个典型的应用场景,展示了事务如何确保数据的一致性和完整性。场景一:淘宝购物中的资金流转问题假设你在淘宝上购买了一把阿米洛的键盘,当你完成支付后,资金已经从你的支付宝账户中扣除。然而,就在此......
  • Oracle,PostgreSQL,MySql,SqlServer各数据库查元信息的SQL
    Oracle查询表字段信息SELECTa.COLUMN_NAMEASB_NAME,--字段名称a.DATA_TYPE,--字段数据类型CASEWHENa.COLUMN_NAMEIN(SELECTcols.column_nameFROMall_constraintscons,all_cons_columnsco......