浅谈mysql数据库事物隔离级别

 更新时间:2023年05月25日 10:24:56   作者:幸福的小雨  
本文主要介绍了浅谈mysql数据库事物隔离级别,数据库事务的隔离级别有4个,这四个级别可以逐个解决脏读 、不可重复读 、幻读这几类问题,本文就详细的介绍一下,感兴趣的可以了解一下

 一、数据库事务的隔离级别

数据库事务的隔离级别有4个,由低到高依次为Read uncommitted(读未提交) 、Read committed(读已提交) 、Repeatable read(重复读) 、Serializable(序列化) ,这四个级别可以逐个解决脏读 、不可重复读 、幻读这几类问题。

Read UnCommitted(读未提交)
最低的隔离级别。一个事务可以读取另一个事务并未提交的更新结果。

Read Committed(读提交)
大部分数据库采用的默认隔离级别。一个事务的更新操作结果只有在该事务提交之后,另一个事务才可以的读取到同一笔数据更新后的结果。

Repeatable Read(重复读)
mysql的默认级别。整个事务过程中,对同一笔数据的读取结果是相同的,不管其他事务是否在对共享数据进行更新,也不管更新提交与否。

Serializable(序列化)
最高隔离级别。所有事务操作依次顺序执行。注意这会导致并发度下降,性能最差。通常会用其他并发级别加上相应的并发锁机制来取代它。

二、不同事务级别带来的并发问题

脏读

脏读发生在一个事务A读取了被另一个事务B修改,但是还未提交的数据。假如B回退,则事务A读取的是无效的数据。这跟不可重复读类似,但是第二个事务不需要执行提交。

总结:事务1读取了事务2修改但未被提交的数据,称之为脏读。

不可重复读

在基于锁的并行控制方法中,如果在执行select时不添加读锁,就会发生不可重复读问题。在多版本并行控制机制中,当一个遇到提交冲突的事务需要回退但却被释放时,会发生不可重复读问题。

在上面这个例子中,事务2提交成功,它所做的修改已经可见。然而,事务1已经读取了一个其它的值。在序列化和可重复读的隔离级别中,数据库管理系统会返回旧值,即在被事务2修改之前的值。在提交读和未提交读隔离级别下,可能会返回被更新的值,这就是“不可重复读”。

有两个策略可以防止这个问题的发生:
(1) 推迟事务2的执行,直至事务1提交或者回退。这种策略在使用锁时应用。
(2) 而在多版本并行控制中,事务2可以被先提交。而事务1,继续执行在旧版本的数据上。当事务1终于尝试提交时,数据库会检验它的结果是否和事务1、事务2顺序执行时一样。如果是,则事务1提交成功。如果不是,事务1会被回退。

总结:当事物2修改的数据已被提交(commited),但还未被设置到可重复读状态时。事物1读取的数据还是旧版本数据,称之为不可重复读。

幻读

幻读发生在当两个完全相同的查询执行时,第二次查询所返回的结果集跟第一个查询不相同。发生的情况:没有范围锁。

总结:当事物1读取数据后,事物2插入了一条信息,这时事物1再读取数据,发现第一次读取的数据和第二次读取的数据不一致称之为幻读。

三、不可重复读和幻读比较

不可重复读

不可重复读的重点是修改: 同样的条件, 你读取过的数据, 再次读取出来发现值不一样了

例子:

在事务1中,Mary 读取了自己的工资为1000,操作并没有完成

con1 = getConnection();  
select salary from employee empId ="Mary";  

在事务2中,这时财务人员修改了Mary的工资为2000,并提交了事务.

con2 = getConnection();  
update employee set salary = 2000;  
con2.commit(); 

在事务1中,Mary 再次读取自己的工资时,工资变为了2000

select salary from employee empId ="Mary"; 

在一个事务中前后两次读取的结果并不致,导致了不可重复读。

幻读

幻读的重点在于新增或者删除 (数据条数变化)。同样的条件, 第1次和第2次读出来的记录数不一样

例子:

目前工资为1000的员工有10人。
事务1,读取所有工资为1000的员工。

con1 = getConnection();  
select * from employee where salary =1000;  

共读取10条记录

这时另一个事务向employee表插入了一条员工记录,工资也为1000

con2 = getConnection();  
Insert into employee(empId,salary) values("Lili",1000);  
con2.commit();  

事务1再次读取所有工资为1000的员工

select * from employee where salary =1000; 

共读取到了11条记录,这就像产生了幻读。

到此这篇关于浅谈mysql数据库事物隔离级别的文章就介绍到这了,更多相关mysql事物隔离级别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MYSQL命令行导入导出数据库详解

    MYSQL命令行导入导出数据库详解

    这篇文章主要详细介绍了MYSQL命令行进行导入导出数据库操作的方法,并且分win系统和Linux系统介绍了mysql备份和还原的方法,非常的详细,希望对大家能有所帮助
    2014-09-09
  • MySQL数据库的性能优化

    MySQL数据库的性能优化

    这篇文章主要介绍了MySQL数据库的性能优化,文中介绍的非常详细,一定的参考价值,感兴趣的同学可以参考阅读
    2023-04-04
  • windows 64位下mysql8.0.25安装配置教程(最详细!)

    windows 64位下mysql8.0.25安装配置教程(最详细!)

    之前一直在用 5.7 版本,竟然一下子跳到 8.0了,下面这篇文章主要给大家介绍了关于在windows 64位下mysql8.0.25安装配置教程,文章通过图文介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • 解析MySQL8.0新特性——事务性数据字典与原子DDL

    解析MySQL8.0新特性——事务性数据字典与原子DDL

    这篇文章主要介绍了MySQL8.0新特性——事务性数据字典与原子DDL的相关资料,帮助大家更好的理解和学习MySQL8.0感兴趣的朋友可以了解下
    2020-08-08
  • MySQL查询进阶操作从函数到表连接的使用

    MySQL查询进阶操作从函数到表连接的使用

    这篇文章主要介绍了MySQL查询进阶从函数到表连接的使用,包括mysql函数的使用,MySQL的分组分页及查询关键字的执行顺序,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • MySQL索引事务详细解析

    MySQL索引事务详细解析

    这篇文章主要介绍了MySQL数据库索引事务,索引是为了加速对表中数据行的检索而创建的一种分散的存储结;事物是属于计算机中一个很广泛的概念,一般是指要做的或所做的事情,下面我们就一起进入文章了解具体内容吧
    2022-01-01
  • 深入MySQL存储引擎比较的详解

    深入MySQL存储引擎比较的详解

    本篇文章是对MySQL存储引擎的比较进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • mysql创建本地用户及赋予数据库权限的方法示例

    mysql创建本地用户及赋予数据库权限的方法示例

    这篇文章主要介绍了mysql创建本地用户及赋予数据库权限的相关资料,文中的介绍的非常详细,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
    2017-04-04
  • Mysql中聚簇索引和非聚簇索引的区别详解

    Mysql中聚簇索引和非聚簇索引的区别详解

    这篇文章主要介绍了Mysql中聚簇索引和非聚簇索引的区别详解,聚簇索引就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的就是整张表的行记录数据,也将聚集索引的叶子节点称为数据页,需要的朋友可以参考下
    2023-07-07
  • MySQL ALTER命令使用详解

    MySQL ALTER命令使用详解

    这篇文章主要为大家详细介绍了MySQL ALTER命令的使用方法,简单实用,感兴趣的小伙伴们可以参考一下
    2016-05-05

最新评论