mysql与缓存脏读_MySQL 事务的隔离级别问题 之 脏读

1. 脏读

所谓的脏读就是指一个事务读取了另一个事务未提取的数据。

试想一下:a账户要给b账户100元购买商品,如果a账户开启一个事务,执行下面的update语句做了如下转账的工作:

update account set money=money-100 where name='a';

update account set money=money+100 where name='b';

如果a账户先不提交事务,通知b账户来查询,由于b的隔离级别比较低,此时就会读取a事务中未提交的数据,发现a确实给自己转了100元,然后给a发货,等b发货成功之后,a再将事务回滚,此时b就会受到损伤,这就是脏读造成的。

为了演示上面的情况,这里我们开启了两个命令行窗口(相当于开启两个线程),分别模拟a账户和b账户,如下:

dfed7b9580b5aa4a08c906f22dd87106.png

(1)设置b账户中事务的隔离级别

大家都知道MySQL的默认隔离级别是Repeatable Read(可重复读),该级别是可以避免脏读的,因此需要将b账户中事务的隔离级别设置为Read Uncommitted(读未提交),具体语句如下:

set session transaction isolation level read uncommitted;

如下:

986efad5a6fb9e217c027b2107526f48.png

上述语句之中,session表示当前会话,transaction就表示事务,isolation表示隔离,level表示级别,read uncommitted表示当前的隔离级别,该语句执行成功之后,使用select语句查询事务的隔离级别,结果如下:

select @@tx_isolation;

如下:

43b109b816f350364800cc44bb50da71.png

从上述结果可以看出,b账户的事务隔离级别以及修改为Read Uncommitted,接下来就是演示脏读的情况

2)演示脏读

b账户:为了证明出现了脏读的情况,首先在b账户中开户一个事务,并在该事务中查询当前账户的余额信息,查询结果如下:

start transaction;

select * from account;

如下:

bbbee950ac99713890f5b008328a6368.png

a账户:在a账户中开启一个事务,并在当前窗口中执行转账功能,具体语句如下:

start transaction;

update account set money=money-100 where name='a';

update account set money=money+100 where name='b';

如下:

5abafe048f23624bbfdb2647b202f354.png

需要注意的是:此时不要提交事务,如果提交事务就无法演示出现脏读的情况。

b账户:a账户执行完转账语句后,b账户查询当前账户,如下:

8d9f3807f49b7d8e5e50a70de84b3d94.png

从上面的查询结果来看,a账户已经成功给b账户转账了100元,这是由于b账户的事务隔离级别比较低,因此才读取了a账户还没有提交的数据内容,出现了脏读的情况,这时候,b误以为a账户以及转账成功,便会给a发货,当b发货之后a如果不提交事务将事务回滚,b就会受到损失。

上面演示完毕了,需要将a账户中的事务回滚,b账户中的事务提交。

(3)设置b账户的事务隔离级别

为了防止脏读发生,可以将b账户中的事务隔离级别设置为Read Committed(读提交),该级别会避免脏读,具体语句如下:

set session transaction isolation level read committed;

上述的语句执行成功之后,b账户的隔离级别已经设置成Read Committed

(4)验证是否出现脏读

b账户:为了说明没有出现脏读的情况,首先要在b账户中开启一个事务,并在该事务中查询各账户的余额情况,查询结果如下:

fefc113aff68bc1604801d737c1b6ce5.png

a账户:在a账户中重新开启一个事务,实现了转账功能,如下:

start transaction;

update account set money=money-100 where name='a';

update account set money=money+100 where name='b';

b账户:当a 账户转账成功之后,可以在b账户中再次查询各账户的余额信息,查询结果如下:

410af79d6e4a03e3dcf0ee4e4c5fcd7e.png

通过上面的对比两次查询结果可以发现,b账户在同一个事务中的查询结果是一致的,并没有查询到a账户中未提交的内容,因此可以说明Read Committed 隔离级别可以避免脏读,最后分别将a账户和b账户中的事务回滚.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470051.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP MYSQL关键词统计系统_PHP MySQL Order By 关键词

ORDER BY 关键词ORDER BY 关键词用于对记录集中的数据进行排序。语法SELECT column_name(s)FROM table_nameORDER BY column_name注释:SQL 对大小写不敏感。ORDER BY 与 order by 等效。例子下面的例子选取 "Persons" 表中的存储的所有数据,并…

mysql 数据库引擎介绍_MYSQL 数据库引擎介绍

一般来说,MySQL有以下几种引擎:ISAM、MyISAM、HEAP、InnoDB和Berkley(BDB)。注意:不同的版本支持的引擎是有差异的。当然啦,如果你感觉自己的确技术高超,你还能够使用MySQL来创建自己的数据库引擎,这个已经…

linux解压eclipse启动时无法找到jre环境的解决办法

使用软链接的方法: 1.打开终端进入到eclipse安装主目录下:mkdir jre 2.cd jre 3.ln -s /home/zhoushuo/app/jdk1.8.0_102/bin bin转载于:https://www.cnblogs.com/shuo1208/p/5927218.html

linux as5 启动mysql_Red Hat AS5进入救援模式的步骤

当因为某些原因导致无法通过正常引导进入系统,如GRUB损坏或者误删除了某些重要的系统配置文件,或者进行某些特殊的系统维护任务,例如忘记了root用户的口令需要进行重置。就需要使用Linux救援模式。(1)放入操作系统光盘(2)boot:下输…

VC使用sqlite

SQLite可以到官方站点(http://www.sqlite.org/download.html)下载:Linux,Mac OS X, Windows下的已编译文件以及源代码、帮助文档。 SQLite官方下载只提供给我们一个sqlite3.dll跟一个sqlite3.def文件,并没有提供用于VC6.0的lib文件,可以利用s…

mysql5.7.10 二进制包_MYSQL5.7二进制包的安装

mysql5.7 二进制包安装1. 下载包wget http://mirrors.sohu.com/mysql/MySQL-5.7/mysql-5.7.12-linux-glibc2.5-x86_64.tar.gz2. 解压tar xxvf mysql-5.7.12-linux-glibc2.5-x86_64.tar.gzmv mysql-5.7.12-linux-glibc2.5-x86_64 /usr/local/mysql3. 初始化useradd -M -s /sbin/…

easyUI文本框textbox笔记

知识点&#xff1a; 1.图标位置 Icon Align属性&#xff0c;有left和right两个&#xff1b; 2.textbox的setvalue方法&#xff0c;getvalue方法。 <div style"margin:10px 0 20px 0"><span>Select Icon Align: </span><select οnchange"$…

python代码计算字数_Python计算一个文件里字数的方法

本文实例讲述了Python计算一个文件里字数的方法。分享给大家供大家参考。具体如下&#xff1a;这段程序从所给文件中找出字数来。from string import *def countWords(s):wordssplit(s)return len(words)#returns the number of wordsfilenameopen("welcome.txt",r)#…

《A First Course in Probability》-chape4-离散型随机变量-几种典型分布列

超几何分布&#xff1a; 超几何分布基于这样一个模型&#xff0c;一个坛子中有N个球&#xff0c;其中m个白球&#xff0c;N-m个黑球&#xff0c;从中随机取n(不放回)&#xff0c;令X表示取出来的白球数&#xff0c;那么&#xff1a; 我们称随机变量X满足参数为(n,m,M)的超几何分…

sid更新 续订sas软件_顶级统计软件sas9.4 64位sid 有效期至2017年6月底

去掉去掉去掉去掉去掉去掉去掉去掉去掉去掉去掉去掉去掉去掉去掉去掉去掉去掉去掉去掉去掉去掉去掉去掉去掉去掉去掉去掉去掉去掉[_SID_]Version9.4Revision9.4Platform_longMicrosoft Windows Workstation for x64Platform_shortwx6Order9BHX96License_prodSASSetnumid1200146…

农历01

1、NongLi.cpp // NongLi.cpp : Defines the entry point for the console application. //#include <stdio.h> #include "xDate.h"// http://www.chinapyg.com/forum.php?modviewthread&tid2928int main(int argc, char* argv[]) {xDate *dateX new xDa…

java内联_JAVA中的内联函数

在说内联函数之前&#xff0c;先说说函数的调用过程。调用某个函数实际上将程序执行顺序转移到该函数所存放在内存中某个地址&#xff0c;将函数的程序内容执行完后&#xff0c;再返回到转去执行该函数前的地方。这种转移操作要求在转去前要保护现场并记忆执行的地址&#xff0…

两端对齐布局与text-align:justify

百分比实现 首先最简单的是使用百分比实现&#xff0c;如下一个展示列表&#xff1a; 1 <!DOCTYPE html>2 <html>3 <head>4 <meta charset"UTF-8">5 <title></title>6 <style type"text/cs…

java拆分单元格_Java 拆分Excel单元格数据为多列

一、概述及使用工具在Excel表格里面&#xff0c;可设置将单元格中的文本数据按分隔符拆分为多列&#xff0c;下面通过Java程序来介绍具体实现方法。这里使用Free Spire.XLS for Java(免费版)来实现数据分列&#xff0c;需要导入Spire.Xls.jar文件到Java程序&#xff0c;可参考以…

win10下安装centos7双系统

国庆最后一天了&#xff0c;闲来无事装个双系统&#xff0c;用虚拟机的linux总有些不方便。 window下安装linux双系统有两中方法&#xff1a; 1.U盘安装 &#xff08;我采用的方法&#xff0c;后面详述&#xff09; 2.EasyBCD工具安装 &#xff08;使用EasyBCD完美实现Windows7…

css 相对定位与绝对定位

相对定位的规律&#xff1a; 使用相对定位的盒子&#xff0c;会相对于它原来的位置&#xff0c;通过偏移指定的距离&#xff0c;到达新的位置。 使用相对定位的盒子仍在标准流中&#xff0c;它对父亲和兄弟盒子都没有任何影响。 绝对定位的规律&#xff1a; 使用绝对定位的盒子…

java swing进度条_Java Swing创建自定义闪屏:在闪屏上添加Swing进度条控件(转)

本文将讲解如何做一个类似MyEclipse启动画面的闪屏&#xff0c;为Java Swing应用程序增添魅力。首先看一下效果图吧&#xff0c;原理很简单&#xff0c;就是创建一个Dialog&#xff0c;Dialog有一个进度条和一个Label用来分别显示进度和进度信息&#xff0c;而Dialog的宽度和高…

java excel 模板 替换_JAVA POI替换EXCEL模板中自定义标签(XLSX版本)满足替换多个SHEET中自定义标签...

个人说明&#xff1a;为了简单实现导出数据较少的EXCEL(根据自定义书签模板)一、替换Excel表格标签方法/*** 替换Excel模板文件内容* param map* 需要替换的标签建筑队形式* param intPath* Excel模板文件路径* param outPath* Excel生成文件路径*/public static boolean repla…

【JZOJ4817】【NOIP2016提高A组五校联考4】square

题目描述 输入 输出 样例输入 3 4 1 1 0 1 0 1 1 0 0 1 1 0 5 1 1 2 3 2 1 3 2 3 2 3 4 1 1 3 4 1 2 3 4 样例输出 1 1 1 2 2 数据范围 解法 设f[i][j]为以(i,j)为右下角的正方形的最大边长。 则f[i][j]min(f[i−1][j],f[i−1][j−1],f[i][j−1])1(a[i][j]1) 考虑…

java单例模式 uml_Java设计模式系列之单例模式

单例模式的定义一个类有且仅有一个实例&#xff0c;并且自行实例化向整个系统提供。比如&#xff0c;多程序读取一个配置文件时&#xff0c;建议配置文件时&#xff0c;建议配置文件封装成对象。会方便操作其中的数据&#xff0c;又要保证多个程序读到的是同一个配置文件对象&a…