美文网首页
事务隔离级别

事务隔离级别

作者: 欧阳_z | 来源:发表于2020-08-25 18:42 被阅读0次

1、先创建 1 张表

DROP TABLE IF EXISTS `avengers`;

CREATE TABLE `avengers` ( 
`id` int(11) NOT NULL, 
`name` varchar(30) NOT NULL, 
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB;

INSERT INTO `avengers` VALUES (1, 'CaptainBritain');
INSERT INTO `avengers` VALUES (2, 'Hulk');
INSERT INTO `avengers` VALUES (3, 'Thor');

(1)模拟 脏读
客户端 1 设置最低隔离级别的 "读未提交",设置不自动提交事务:

mysql> SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
mysql> SET autocommit = 0;

在客户端 2 开启一个事务,在表中加入一条新的记录,先不提交。

mysql> BEGIN;
mysql> INSERT INTO `avengers` VALUES (4, 'SpiderMan');

在客户端 1 中,查看当前的表,看到了未提交的一条记录

mysql> select * from avengers;
+----+----------------+
| id | name           |
+----+----------------+
|  1 | CaptainBritain |
|  2 | Hulk           |
|  3 | Thor           |
|  4 | SpiderMan      |
+----+----------------+

此时客户端 2 可以回滚,造成脏读。

ROLLBACK;

(2)模拟 不可重复读
客户端 1 设置最低隔离级别的 "读已提交",
查看 id=1 的数据 :

mysql> SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
mysql> SET autocommit = 0;
mysql> BEGIN;
mysql> select * from avengers WHERE id=1;
+----+----------------+
| id | name           |
+----+----------------+
|  1 | CaptainBritain |
+----+----------------+

客户端 2 对 id=1 的记录修改 name 为 IronMan 并自动提交 :

mysql> UPDATE `avengers` SET name = 'IronMan' WHERE id=1;

客户端 1 再次进行查询 id=1 的数据与之前不同了,对于客户端 1 来说,同一条查询语句出现了“不可重复读”。

mysql> select * from avengers where id=1;
+----+---------+
| id | name    |
+----+---------+
|  1 | IronMan |
+----+---------+

(3)模拟 幻读
客户端 1 设置 "可重复读",查询数据表中的所有数据

mysql> SET autocommit = 0;
mysql> SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
mysql> BEGIN;
mysql> select * from avengers;
+----+---------+
| id | name    |
+----+---------+
|  1 | IronMan |
|  2 | Hulk    |
|  3 | Thor    |
+----+---------+

客户端 2,插入新的数据并自动提交

mysql> INSERT INTO `avengers` VALUES (4, 'AntMan');

再用客户端 1 重新select,多出一条数据,出现幻读。

mysql> select * from avengers;
+----+----------------+
| id | name           |
+----+----------------+
|  1 | CaptainBritain |
|  2 | Hulk           |
|  3 | Thor           |
|  4 | AntMan         |
+----+----------------+

(4)可串行化
客户端 1 设置 "可串行化",再做上述实验,三种异常都不会出现了。

mysql> SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;

相关文章

  • Spring 中的事务隔离级别

    什么是事务隔离级别? 事务隔离级别是对事务 4 大特性中隔离性的具体体现,使用事务隔离级别可以控制并发事务在同时执...

  • MySQL_tx_isolation

    事务隔离级别 一、数据库事务隔离级别数据库事务的隔离级别有4个,由低到高依次为Read uncommitted 、...

  • MySQL事务隔离级别和实现原理,看这一篇就够了!!!

    经常提到数据库的事务,那你知道数据库还有事务隔离的说法吗,事务隔离还有隔离级别,那什么是事务隔离,隔离级别又是什么...

  • 面试题

    基础知识 1、事务隔离级别 补充: 1、事务隔离级别为读提交时,写数据只会锁住相应的行 2、事务隔离级别为可重复读...

  • 数据库事务相关

    事务隔离级别(tx_isolation)mysql 有四级事务隔离级别 每个级别都有字符或数字编号 级别symbo...

  • 关于Spring的事务Transactional,锁同步,并发线

    Spring事务传播机制和数据库隔离级别 在标准SQL规范中定义了4个事务隔离级别,不同隔离级别对事务处理不同 。...

  • Mysql事务

    事务隔离级别 事务隔离级别有四种:read-uncomitted,read-commited,repeatable...

  • mysql事务-2020-11-21

    use test查询事务隔离级别:select @@tx_isolation; 设置事务隔离级别://全局的set...

  • MYSQL事务

    常用语句 MYSQL事务,锁表 事务控制语句 事务的隔离级别 隔离级别描述产生风险READUNCOMMITTED ...

  • 事务

    事务隔离级别 隔离级别是指若干个并发的事务之间的隔离程度。TransactionDefinition 接口中定义了...

网友评论

      本文标题:事务隔离级别

      本文链接:https://www.haomeiwen.com/subject/hvrojktx.html