MySQL事务的读脏

所谓读脏,是指一个事务读取了,另外一个事务未提交的数据 首先,开启两个命令行窗口,模拟账户a和账户b 登录数据库,chapter06

这里写<a href=图片描述" title="">

设置b账户,事务的隔离级别 MysqL默认的隔离级别是REPEATABLE READ——可重复读 该级别是可以避免读脏的,因此,需要将b账户中事务的隔离级别设置为READ UNCOMMITTED——读未提交

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

<h3 id="参数说明">参数说明

SESSION,表示当前会话 TRANSACTION,表示事务 ISOLATION,表示隔离 LEVEL,表示级别 READ UNCOMMITTED,表示当前的隔离级别

这里写<a href=图片描述" title="">

可以看出,b账户的隔离级别,已经设置为了READ UNCOMMITTED

<h3 id="演示读脏">演示读脏

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

这里写<a href=图片描述" title="">

A账户,在a账户中开启一个事务,在当前窗口中,执行转账功能

这里写<a href=图片描述" title="">

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

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

这里写<a href=图片描述" title="">

可以看出,a账户已经成功给b账户,转账了100元 这时,由于b账户的事务隔离级别较低,因此,读取了a账户中,还没有提交的内容,出现了脏读的情况,此时,b误以为a账户已经转账成功了,便给a发货 当b发货之后,a如果不提交事务,而是将事务回滚,此时,b就受了损失 演示完毕之后,将a账户中的事务回滚,b账户中的事务提交

设置b账户中,事务的隔离级别 为了防止脏读发生,将b账户的隔离级别设置为READ COMMITED——读提交,该级别可以避免读脏

这里写<a href=图片描述" title="">

可以看出,b账户的隔离级别,已经设置为了READ COMMITTED;

<h3 id="验证是否脏读">验证是否脏读

B账户,在b账户中开启一个事务,在事务中查询个账户的余额

这里写<a href=图片描述" title="">

A账户,在a账户中,重新开启一个事务,实现转账功能

这里写<a href=图片描述" title="">

B账户,当a账户转账成功之后,在b账户中,查询各账户的余额

这里写<a href=图片描述" title="">

可以看出,b账户在同一个事务中,查询结果是一致的,并没有查询到a账户中,未提交的内容 因此,说明READ COMMITTED隔离级别可以避免读脏,最后,分别将a账户和b账户中的事务回滚

相关文章

昨天的考试过程中,有个考点的服务器蓝屏重启后发现Mysql启动不了(5.6.45 x32版本,使用innoDB),重装后...
整数类型 标准 SQL 中支持 INTEGER 和 SMALLINT 这两种类型,MySQL 数据库除了支持这两种类型以外,还扩...
一条 SQL 查询语句结构如下: SELECT DISTINCT &lt;select_list&gt; FROM &lt;left_table&...
数据备份 1. 备份数据库 使用 mysqldump 命令可以将数据库中的数据备份成一个文本文件,表的结构和数据...
概述 在实际工作中,在关系数据库(MySQL、PostgreSQL)的单表数据量上亿后,往往会出现查询和分析变慢...
概述 触发器是 MySQL 的数据库对象之一,不需要程序调用或手工启动,而是由事件来触发、激活,从而实现...