IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 一章学懂Mysql事务隔离级别 -> 正文阅读

[大数据]一章学懂Mysql事务隔离级别

查看系统当前隔离级别??select @@global.tx_isolation;

repeatable read(MySQL默认隔离级别也就是可重复读)

以下是事务隔离级别图

隔离级别

脏读

不可重复读

幻读

读未提交read-uncommitted

读已提交read-committed

可重复读repeatable-read?(默认)

序列化(一条条地进行)serializable

?读未提交read-uncommitted? ?:事务A里面读到事务B未提交(commit)的数据

读已提交read-committed :?事务A里面读到事务B已经提交(commit)的数据

可重复读repeatable-read?(默认) :解决了读未提交和读已提交,但是会出现幻读,会事务A里面第一次能读取到事务B最新提交的数据

幻读 事务A里面读取到了事务B新增的记录(事务B有commit)

序列化(一条条地进行)serializable

winiis_account?表结构

读未提交read-uncommitted

set global ????tx_isolation='read-uncommitted'

show variables like 'tx_isolation'

select * from winiis_account where username=866700?????结果 700

读未提交read uncommitted

set global ????tx_isolation='read-uncommitted'

show variables like 'tx_isolation'

select * from winiis_account where username=866700?????结果 700

start TRANSACTION ?

start TRANSACTION

select * from winiis_account where username=866700?????结果 700 ?第一次查询的是700

update winiis_account set balance=balance-50 where username='866700'?//结果650

select * from winiis_account where username=866700?????结果 650 第二次查询的是650,两个结果不一样,在事务A里面查询到事务B未commit的数据,假如事务B做rollback操作、650就变成了700,而我们程序用了700的值做往下的计算,导致bug

select * from winiis_account where username=866700?????结果 650

Commit

Commit

select * from winiis_account where username=866700?????结果 650

select * from winiis_account where username=866700?????结果 650

读已提交read-committed??不可重复读(第一次读700 ?第二次读是650 )

set global ????tx_isolation='read-committed'

show variables like 'tx_isolation'

读已提交read-committed

Set???global ????tx_isolation='read-committed'

show variables like 'tx_isolation'

select * from winiis_account where username=866700?????结果 700

select * from winiis_account where username=866700?????结果 700

start TRANSACTION ?

start TRANSACTION ?

select * from winiis_account where username=866700?????结果 700

update winiis_account set balance=balance-50 where username='866700'?//结果650

select * from winiis_account where username=866700?????结果 700

select * from winiis_account where username=866700 //结果650

Commit

select * from winiis_account where username=866700 ??//结果650 第二次不应该是650而是700, ?与上面的700两次查询不一致,事务A不能查询到事务B已经commit的数据,因为事务相互隔离,在同一个事务中,多次查询应该是同一个值也就是700

select * from winiis_account where username=866700 ??//结果650

Commit

select * from winiis_account where username=866700 ??//结果650

select * from winiis_account where username=866700 ??//结果650

select * from winiis_account where username=866700 ??//结果650

可重复读 REPEATABLE-READ

set global ??tx_isolation='REPEATABLE-READ'

show variables like 'tx_isolation'

select * from winiis_account where username=866700?????结果 700

可重复读 REPEATABLE-READ

set global ??tx_isolation='REPEATABLE-READ'

show variables like 'tx_isolation'

select * from winiis_account where username=866700?????结果 700

start TRANSACTION

start TRANSACTION

select * from winiis_account where username=866700?????结果 700 ?事务中可重复读级别下,第一次查询的数据会被缓存到mysql中

update winiis_account set balance=balance-50 where username='866700'

commit

select * from winiis_account where username=866700?????结果 700 事务中可重复读级别下,第二次查询,其实查询的是上面的缓存数据,而不是最新数据,这就是可重复读。会产生幻读。

select * from winiis_account where username=866700?????结果 650

commit

select * from winiis_account where username=866700?????结果 650

select * from winiis_account where username=866700??????结果 650

select * from winiis_account where username=866700?????结果 650

可重复读注意点

可重复读注意点

select * from winiis_account where username=866700???结果 700

select * from winiis_account where username=866700????结果 700

start TRANSACTION

start TRANSACTION

update winiis_account set balance=balance-50 where username='866700'???结果650

Commit

select * from winiis_account where username=866700????结果 650 ?第一次查询,会查询到其他事务修改后的最新数据库记录。记住是数据库最新的记录

select * from winiis_account where username=866700????结果 650

update winiis_account set balance=balance-50 where username='866700'??结果600

select * from winiis_account where username=866700????结果 650 第二次查询是以第一次查询出来的快照版本不再是最新的记录了

Commit

select * from winiis_account where username=866700??结果 600

可重复读注意点

可重复读注意点

select * from winiis_account where username=866700???结果 700

select * from winiis_account where username=866700???结果 700

start TRANSACTION

start TRANSACTION

update winiis_account set balance=balance-50 where username='866700'???结果650

Commit

select * from winiis_account where username=866700????结果 650 ?第一次查询,会查询到其他事务修改后的最新数据库记录。记住是数据库最新的记录

select * from winiis_account where username=866700??结果650

select * from winiis_account where username=866700????结果 650 第二次查询是以第一次查询出来的快照版本不再是最新的记录了

update winiis_account set balance=balance-50 where username='866700'?结果600

select * from winiis_account where username=866700??结果600,因为自己的事务内更新后来查询,肯定能查询到自己更新后变化的数据

Commit

select * from winiis_account where username=866700??结果600

select * from winiis_account where username=866700??结果600

select * from winiis_account where username=866700??结果600

幻读 事务A里面读取到了事务B新增的记录(事务B有commit)

幻读

select * from winiis_account ??//结果69条

select * from winiis_account ??//结果69条

start TRANSACTION

start TRANSACTION

insert into winiis_account(username,balance,freeze,regtime,withdrawable,version)VALUES('aaaads11a',8000,0,'',0,0)

Commit

select * from winiis_account ??//结果70条 读取到了事务B ?????commit新增的数据,不符合事务隔离性

winiis_account(username,balance,freeze,regtime,withdrawable,version)VALUES('aabbb',8000,0,'',0,0)

select * from winiis_account ??//结果70条 ?第二次读取到的是MVCC的快照版本70条

commit

select * from winiis_account ??//结果71条

?

?序列化,不演示,一条条地进行,项目中不会使用到

注意事项 : 更新MYSQL数据,要用以下的方式进行更新,不能使用查询后的变量去更新

推荐使用:? update winiis_account set balance=balance-50 where username='866700'? ?

?不能使用 $balance = "selelct balance?? from winiis_account where username=866700";

update winiis_account set balance=$balance? where username='866700'? ?

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-09-24 10:37:42  更:2021-09-24 10:39:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 22:58:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码