实例分析MySQL下的四种事务隔离级别

网友投稿 572 2023-05-02

实例分析MySQL下的四种事务隔离级别

实例分析MySQL下的四种事务隔离级别

数据库事务有四种隔离级别:

上面这样的教科书式定义***次接触事务隔离概念的朋友看了可能会一脸懵逼,下面我们就通过具体的实例来解释四个隔离级别。

首先我们创建一个user表:

CREATE TABLE user (     `id` int(11) NOT NULL AUTO_INCREMENT,     `name` varchar(255) NOT NULL,     PRIMARY KEY (`id`),     UNIQUE `uniq_name` USING BTREE (name) ) ENGINE=`InnoDB` AUTO_INCREMENT=10 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

读未提交隔离级别

在下面我们开了两个终端分别用来模拟事务一和事务二,p.s: 操作一和操作二的意思是按照时间顺序来执行的。

事务1

mysql> start transaction; # 操作1  Query OK, 0 rows affected (0.00 sec)  mysql> insert into user(name) values('ziwenxie'); # 操作3  Query OK, 1 row affected (0.05 sec)

事务2

mysql> start transaction; # 操作2  Query OK, 0 rows affected (0.00 sec)  mysql> select * from user; # 操作4  +----+----------+  | id | name |  +----+----------+  | 10 | ziwenxie |  +----+----------+  1 row in set (0.00 sec)

读提交隔离级别

事务一

事务二

可重复读隔离级别

MySQL的Innodb存储引擎默认的事务隔离级别就是可重复读隔离级别,所以我们不用进行多余的设置。

事务一

事务二

Innodb解决了幻读么

实际上RR级别是可能产生幻读,InnoDB引擎官方称中利用MVCC多版本并发控制解决了这个问题,下面我们验证一下Innodb真的解决了幻读了么?

为了方便展示,我修改了一下上面的user表:

mysql> alter table user add salary int(11);  Query OK, 0 rows affected (0.51 sec)  Records: 0 Duplicates: 0 Warnings: 0  mysql> delete from user;  Query OK, 1 rows affected (0.07 sec)  mysql> insert into user(name, salary) value('ziwenxie', 88888888);  Query OK, 1 row affected (0.07 sec)  mysql> select * from user;  +----+----------+----------+  | id | name | salary |  +----+----------+----------+  | 10 | ziwenxie | 88888888 |  +----+----------+----------+  1 row in set (0.00 sec)

事务一

事务二

从上面的例子可以看出,Innodb并没有如官方所说解决幻读,不过上面这样的场景中也不是很常见不用过多的担心。

串行化隔离级别

所有事务串行执行,***隔离级别,不会出现幻读性能会很差,实际开发中很少使用到。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:阿里10年分布式数据库技术沉淀,AliSQL X-Cluster的应用实战
下一篇:大数据分析,开启企业数字化转型新时代
相关文章