专业IT网络知识平台,分享IT百科知识、生活百科知识解答!

易企推科技
易企推科技

数据库隔离级别,MySQL事务的四大隔离级别

来源:小易整编  作者:小易  发布时间:2023-02-28 05:02
摘要:数据库隔离级别,MySQL事务的四大隔离级别前言之前分析一个死锁问题,发现自己对数据库隔离级别理解还不够深入,所以趁着这几天假期,整理一下MySQL事务的四大隔离级别相关知识,希望对大家有帮助~事务什么是事务?事务,由一个有限的数据库操作序...

数据库隔离级别,MySQL事务的四大隔离级别

前言

之前分析一个死锁问题,发现自己对数据库隔离级别理解还不够深入,所以趁着这几天假期,整理一下MySQL事务的四大隔离级别相关知识,希望对大家有帮助~

数据库隔离级别,MySQL事务的四大隔离级别

事务

什么是事务?

事务,由一个有限的数据库操作序列构成,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。

假如A转账给B 100 元,先从A的账户里扣除 100 元,再在 B 的账户上加上 100 元。如果扣完A的100元后,还没来得及给B加上,银行系统异常了,最后导致A的余额减少了,B的余额却没有增加。所以就需要事务,将A的钱回滚回去,就是这么简单。

事务的四大特性

数据库隔离级别,MySQL事务的四大隔离级别

  • 原子性: 事务作为一个整体被执行,包含在其中的对数据库的操作要么全部都执行,要么都不执行。

  • 一致性: 指在事务开始之前和事务结束以后,数据不会被破坏,假如A账户给B账户转10块钱,不管成功与否,A和B的总金额是不变的。

  • 隔离性: 多个事务并发访问时,事务之间是相互隔离的,一个事务不应该被其他事务干扰,多个并发事务之间要相互隔离。。

  • 持久性: 表示事务完成提交后,该事务对数据库所作的操作更改,将持久地保存在数据库之中。

事务并发存在的问题

事务并发执行存在什么问题呢,换句话说就是,一个事务是怎么干扰到其他事务的呢?看例子吧~

假设现在有表:

CREATE TABLE `account`(`id`int(11) NOT NULL,`name` varchar(255) DEFAULT NULL,`balance`int(11) DEFAULT NULL,  PRIMARY KEY (`id`),  UNIQUE KEY `un_name_idx`(`name`) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8;

表中有数据:

数据库隔离级别,MySQL事务的四大隔离级别

脏读(dirty read)

假设现在有两个事务A、B:

  • 假设现在A的余额是100,事务A正在准备查询Jay的余额

  • 这时候,事务B先扣减Jay的余额,扣了10

  • 最后A 读到的是扣减后的余额

数据库隔离级别,MySQL事务的四大隔离级别

由上图可以发现,事务A、B交替执行,事务A被事务B干扰到了,因为事务A读取到事务B未提交的数据,这就是脏读。

不可重复读(unrepeatable read)

假设现在有两个事务A和B:

  • 事务A先查询Jay的余额,查到结果是100

  • 这时候事务B 对Jay的账户余额进行扣减,扣去10后,提交事务

  • 事务A再去查询Jay的账户余额发现变成了90

数据库隔离级别,MySQL事务的四大隔离级别

事务A又被事务B干扰到了!在事务A范围内,两个相同的查询,读取同一条记录,却返回了不同的数据,这就是不可重复读。

幻读

假设现在有两个事务A、B:

  • 事务A先查询id大于2的账户记录,得到记录id=2和id=3的两条记录

  • 这时候,事务B开启,插入一条id=4的记录,并且提交了

  • 事务A再去执行相同的查询,却得到了id=2,3,4的3条记录了。

数据库隔离级别,MySQL事务的四大隔离级别

事务A查询一个范围的结果集,另一个并发事务B往这个范围中插入/删除了数据,并静悄悄地提交,然后事务A再次查询相同的范围,两次读取得到的结果集不一样了,这就是幻读。

事务的四大隔离级别实践

既然并发事务存在脏读、不可重复、幻读等问题,InnoDB实现了哪几种事务的隔离级别应对呢?

  • 读未提交(Read Uncommitted)

  • 读已提交(Read Committed)

  • 可重复读(Repeatable Read)

  • 串行化(Serializable)

读未提交(Read Uncommitted)

想学习一个知识点,最好的方式就是实践之。好了,我们去数据库给它设置读未提交隔离级别,实践一下吧~

数据库隔离级别,MySQL事务的四大隔离级别

先把事务隔离级别设置为read uncommitted,开启事务A,查询id=1的数据

set session transaction isolation level read uncommitted;begin;select* from account where id =1;

结果如下:

数据库隔离级别,MySQL事务的四大隔离级别

这时候,另开一个窗口打开mysql,也把当前事务隔离级别设置为read uncommitted,开启事务B,执行更新操作

set session transaction isolation level read uncommitted;begin;update account set balance=balance+20where id =1;

接着回事务A的窗口,再查account表id=1的数据,结果如下:

数据库隔离级别,MySQL事务的四大隔离级别

可以发现,在读未提交(Read Uncommitted) 隔离级别下,一个事务会读到其他事务未提交的数据的,即存在脏读问题。事务B都还没commit到数据库呢,事务A就读到了,感觉都乱套了。。。实际上,读未提交是隔离级别最低的一种。

读已提交(READ COMMITTED)

为了避免脏读,数据库有了比读未提交更高的隔离级别,即读已提交。

数据库隔离级别,MySQL事务的四大隔离级别

把当前事务隔离级别设置为读已提交(READ COMMITTED),开启事务A,查询account中id=1的数据


本文地址:IT百科频道 https://www.hkm168.com/tags/903503.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!


IT百科
小编:小易整编
相关文章相关阅读
  • mysql中的不等于符号是什么

    mysql中的不等于符号是什么

    mysql中的不等于符号有两种:“!=”和“”;它们都可用于判断数字、字符串、表达式是否不相等。对于“!=”和“”,如果两侧操作数不相等,返回值为1,否则返回值为0;如果两侧操作数有一个是null,那么返回值也是null。本教程操作环境:w...

  • mysql列转行函数是什么

    mysql列转行函数是什么

    在mysql中,列转行函数是“group_concat()”函数;该函数用于将非空列值按照分组条件进行合并并最终返回,如果其中有空值则返回的结果是空,语法为“selectgroup_concat(name separator';')列...

  • MySQL连接被重置,如何处理?

    MySQL连接被重置,如何处理?

    mysql连接被重置,如何处理?MySQL是一种常用的关系型数据库管理系统,广泛应用于各种不同规模的项目中。然而,在使用MySQL时,有时会遇到连接被重置的情况,这可能会给我们的项目带来一些麻烦。本文将介绍MySQL连接被重置的原因以及如何...

  • 数据库的substr函数用法是什么

    数据库的substr函数用法是什么

    数据库的substr函数用法:1、【substr(str,pos,len)】从pos开始的位置,截取len个字符;2、【substr(str,pos)】pos开始的位置,一直截取到最后。数据库的substr函数用法:1、SUBSTR(st...

  • mysql环境变量如何配置

    mysql环境变量如何配置

    mysql环境变量的配置方法:1、找到c盘中的mysql安装路径;2、在“我的电脑"中,依次点击“系统属性”-“高级系统设置”选项;3、在“环境变量”弹窗中,依次点击“高级”-“系统变量”;4、找到path路径,点击“编辑”选项,......

  • 什么是数据库架构?数据库架构有几层

    什么是数据库架构?数据库架构有几层

    一:什么是数据库架构DBMS体系结构有助于数据库的设计,开发,实现和维护,数据库可以存储企业的关键信息,选择正确的数据库体系结构有助于快速安全地访问数据。二:数据库架构有几层1层架构最简单的数据库体系结构是1层,其中客户端,服务器和数据库都...

  • 关系型数据库系统事务的ACID特性是什么

    关系型数据库系统事务的ACID特性是什么

    关系型数据库系统事务的acid特性:1、原子性;事务里的所有操作要么全部做完,要么都不做。2、一致性;数据库要一直处于一致的状态。3、独立性;并发的事务之间不会互相影响。4、持久性;一旦事务提交后,它所做的修改将会永久的保存在数据库上。本教...

  • mysql查询怎么设置降序

    mysql查询怎么设置降序

    在mysql中,可以利用desc关键字对查询结果进行降序显示,该关键字是descend的缩写,常于orderby子句配合使查询结果降序,语法为“select字段1,字段2...from表名orderby指定字段desc”。本...

  • 周排行
  • 月排行
  • 年排行

精彩推荐