在并发环境下如何处理脏读,幻读,不可重复读

目录

1.对脏读,幻读,不可重复读的理解

2.数据库事务隔离级别

3.如何避免脏读,幻读,不可重复读

3.1如何避免脏读

3.2对乐观锁的理解

3.3如何避免幻读

3.4如何避免可重复读

3.5总结


1.对脏读,幻读,不可重复读的理解

"脏读"、"幻读"和"不可重复读"是数据库事务隔离级别的问题,它们描述了在并发环境下可能发生的一些问题。让我们逐个来理解这些概念:

  • 脏读(Dirty Read):脏读指的是一个事务读取了另一个事务未提交的数据。在这种情况下,如果那个事务最终回滚了,那么读取的数据就是无效的,因此,脏读就像读到了“脏数据”一样。

  • 幻读(Phantom Read):幻读指的是在一个事务中,两次查询同样的条件,但是得到的结果集不同。这是由于另一个事务在两次查询之间插入(或删除)了数据,导致第二次查询看到的数据比第一次查询多(或少)。幻读通常发生在并发的插入和删除操作中。

例如,事务A在查询某个范围的数据时,事务B插入了符合该范围的新数据,导致事务A的两次查询返回的结果集合不一致,就发生了幻读。

  • 不可重复读(Non-Repeatable Read):不可重复读指的是在一个事务中,两次查询同样的数据,但是得到了不同的结果。这是由于在两次查询之间,另一个事务修改或删除了数据,导致第二次查询看到的数据和第一次查询不一样。就像是时间一样,第二次看表的时候,不可能得到第一次看表的时间。

2.数据库事务隔离级别

这些问题的出现是由于数据库事务隔离级别不同导致的。数据库系统提供了不同的隔离级别,每个隔离级别决定了事务在并发执行时,是否能够看到其他事务未提交的数据,以及是否能够避免幻读和不可重复读的问题。

  • READ UNCOMMITTED:最低的隔离级别,允许脏读、幻读和不可重复读。
  • READ COMMITTED:允许不可重复读和幻读,但是避免了脏读。读已经提交了的
  • REPEATABLE READ:避免了脏读和不可重复读,但是允许幻读。可重复读取
  • SERIALIZABLE:最高的隔离级别,避免了脏读、不可重复读和幻读,但是性能较差,因为它会对所有的查询加锁。

3.如何避免脏读,幻读,不可重复读

3.1如何避免脏读

  1. 数据库隔离级别:读已提交
  2. 保证事务的原子性:要么一起成功,要么一起失败
  3. 使用乐观锁:在一些场景下,可以使用乐观锁的方式来避免脏读。乐观锁是通过版本号或时间戳等方式来实现的,当一个事务要更新某行数据时,它会先检查这行数据的版本号或时间戳是否与自己持有的一致,如果一致,则可以更新,否则说明已经被其他事务修改过。
  4. 使用数据库的悲观锁:悲观锁是数据库系统提供的锁机制,可以在读取数据时加锁,阻止其他事务对相同数据的修改,从而避免脏读。
  5. 合理设计事务边界:将事务的范围控制在最小范围内。不要在一个事务中包含不必要的读操作,以减少事务持有锁的时间,从而减少其他事务被阻塞的可能性。
  6. 避免长事务:长时间持有事务会导致锁定资源,增加其他事务被阻塞的可能性。因此,应该尽量避免长事务的存在。        

3.2对乐观锁的理解

乐观锁是一种基于数据版本控制的并发控制机制。与悲观锁(在读取数据时就会对数据加锁)不同,乐观锁是在数据更新时才会对数据进行加锁。乐观锁的核心思想是,假设在事务开始时,不会有其他事务来修改数据,因此在事务提交时,会检查在此期间数据是否被其他事务修改。如果没有被修改,则提交成功;如果被修改了,则需要处理冲突。

如果更新操作失败(即版本号或时间戳不一致),需要根据具体情况决定如何处理冲突。常见的处理方式包括回滚事务、重新读取数据并合并、提示用户解决冲突等。 最终目的就是为了保证数据的一致性。

3.3如何避免幻读

  1. 使用SERIALIZABLE隔离级别SERIALIZABLE隔离级别是数据库中最高的隔离级别,它能够避免脏读、不可重复读和幻读。但是,这种隔离级别会对性能产生较大的影响,因为它会对所有的查询加锁,通常需要谨慎使用。

  2. 使用乐观锁

  3. 使用悲观锁:悲观锁是一种在读取数据时就加锁的机制,可以避免其他事务对相同数据的修改。在关键查询中使用FOR UPDATE(对于MySQL等数据库)或者SELECT ... FOR UPDATE(对于Oracle等数据库)语句,将数据加上排它锁,确保其他事务无法修改这些数据。

  4. 使用范围锁:范围锁是指在一个范围内对数据进行加锁。例如,对于某个表的某个范围的数据进行查询和更新时,可以使用范围锁确保在这个范围内的数据不会被其他事务修改。

  5. 使用快照隔离(Snapshot Isolation):快照隔离是一种在事务开始时创建数据的快照,并在事务中使用该快照来保证读取的一致性。这样可以避免不可重复读和幻读的问题。

3.4如何避免可重复读

  1. 事务的原子性
  2. 使用乐观锁
  3. 使用悲观锁:在读的时候上锁
  4. 尽量减少事务的持有时间:长时间持有事务会导致锁定资源,增加其他事务被阻塞的可能性。因此,应该尽量减少事务的持有时间,只在必要的时候才开启事务。

3.5总结

综上所述,避免脏读,幻读和不可重复读,需要做到

1.加乐观锁

2.加悲观锁

3.尽量减少事务的持有时间

4.合理设计事务边界

5.避免长事务

6.保证事务的原子性

7.使用合适的隔离级别

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/96810.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MVDiffusion】完美复刻场景,可多视图设计的生成式模型

文章目录 MVDiffusion1. 自回归 生成 全景图1.1 错误积累1.2 角度变换大 2. 模型结构2.1 多视图潜在扩散模型(mutil-view LDM)2.1.1 Text-conditioned generation model2.1.2 Image&text-conditioned generation model2.1.3 额外的卷积层 2.2 Correspondence-aware Attenti…

使用python-opencv检测图片中的人像

最简单的方法进行图片中的人像检测 使用python-opencv配合yolov3模型进行图片中的人像检测 1、安装python-opencv、numpy pip install opencv-python pip install numpy 2、下载yolo模型文件和配置文件: 下载地址: https://download.csdn.net/down…

参与现场问题解决总结(Kafka、Hbase)

一. 背景 Kafka和Hbase在现场应用广泛,现场问题也较多,本季度通过对现场问题就行跟踪和总结,同时结合一些调研,尝试提高难点问题的解决效率,从而提高客户和现场满意度。非难点问题(历史遇到过问题&#xf…

数据库学习笔记——DML

数据库学习笔记——DML 建表: CREATE TABLE employee(employee_ID int not null,employee_name varchar(20) not null,street varchar(20) not null,city varchar(20) not null,PRIMARY KEY(employee_ID) );CREATE TABLE company(company_name varchar(30) not nu…

杂七杂八面试题

什么是数据串联,数据隔离和数据越权? 数据串联:数据串联是指攻击者通过多次请求将多个请求串联在一起,从而获取比单个请求中更多的数据或权限。这种攻击通常发生在涉及分页、排序、筛选等操作的场景中,攻击者通过多次请求逐步获取更多的数据。 数据隔离:数据隔离是指不同…

三模块七电平级联H桥整流器电压平衡控制策略Simulink仿真

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

[ubuntu]ubuntu设置虚拟内存

首先查看自己是否加过虚拟内存或者查看虚拟内存当前状态可以命令: free -mh 创建交换分区: sudo mkdir /swap cd /swap sudo dd if/dev/zero ofswapfile bs1024 count12582912 其中count是自己分配内存大小,上面为12GB,你可…

travel总结:

目录 1、前期准备: 2、项目期间: (1)注册功能的实现: 1、前端: 1、表单数据的校验:(js) 2、使用ajax完成表单提交 3、注册成功跳转页面 2、web: 1、获取表单数据、封装数据 2、调…

【Java8】线程问题排查分析

文章目录 thread dump简介JDK 工具jstackjattachjvisualvm Java程序CPU消耗较高,怎么快速看出是那个线程导致的呢?我们可以使用命令 jstack/jattach来快速定位问题 thread dump简介 thread dump 是 Java 进程的所有线程状态的快照。每个线程的状态都通过…

练[MRCTF2020]套娃

[MRCTF2020]套娃 文章目录 [MRCTF2020]套娃掌握知识解题思路代码分析1代码分析2 关键paylaod 掌握知识 ​ 参数的_符号的替换,正则和强等于联合绕过,jsfuck编码,bp请求方式的转变,本地ip的请求头,代码审计&#xff0c…

操作系统的五种IO模型

高级IO 阻塞IO 在内核将数据准备好之前,系统调用会一直等待,所有的套接字默认都是阻塞方式。 非阻塞IO 如果内核还未将数据准备好,系统调用仍然会直接返回,并且返回EWOULDBLOCK错误码。 非阻塞IO往往需要程序员循环的方式反复尝试…

TCP四次挥手

四次挥手发生在断开连接的时候,在程序中当调用了close()会使用TCP协议进行四次挥手。 客户端和服务器端都可以主动发起断开连接,谁先调用close()谁就是发起。 因为在TCP连接的时候,采用三次握手建立的的连接是双向的,在断开的时候…

电脑被删除的文件怎么恢复?2023年数据恢复方法分享

大多数人在使用电脑时都可能会遇到误删文件的情况。一不小心,重要的文件或数据就消失了,情急之下,大多会感到慌乱和无助。但其实,文件误删除并非不可挽回的灾难。本文将为大家介绍几种有效的文件恢复方法,以帮助大家在…

【力扣】42. 接雨水

这道题我卡了差不多1个小时,不是不会做,是不知道怎么能用栈来实现,后面看了一个博主的视频,豁然开朗,我主要的纠结点在于当指针指到7的时候,我计算出4到7的水块是2,但实际上是0,因为…

SpringBoot 可以同时处理多少请求

目录 一、前言 二、相关配置 1、配置信息 2、配置说明 3、案例说明 三、代码验证 1、测试代码 2、测试步骤 四、总结 一、前言 首先,在Spring Boot应用中,我们可以使用 Tomcat、Jetty、Undertow 等嵌入式 Web 服务器作为应用程序的运行容器。这…

Vue中如何进行拖拽与排序功能实现

在Vue中实现拖拽与排序功能 在Web应用程序中,实现拖拽和排序功能是非常常见的需求,特别是在管理界面、任务列表和图形用户界面等方面。Vue.js作为一个流行的JavaScript框架,提供了许多工具和库来简化拖拽和排序功能的实现。本文将介绍如何使…

抖捧自动直播市场火热,实体行业如何实现高效开播?

在AI数字人热度之后,最近抖捧场景自动直播开始火遍全网,因为操作简单成本极低,只需要一部手机放在店里,就可以高效开播,深受广大实体行业老板的认可,那么抖捧实景自动直播的方式,具体是怎么实现…

pytest测试框架

pytest是python的第三方单元测试框架,比自带unittest更简洁和高效,支持非常丰富的插件,同时兼容 unittest 框架。 pytest框架的安装:pip install pytest pytest框架优点: 1、简单灵活,容易上手&#xff…

P1014 [NOIP1999 普及组] Cantor 表

#include <bits/stdc.h> using namespace std; int main() {int n,k1;cin>>n;while (n>k) {nn-k;k;}if(k%20) cout<<n<<"/"<<(k1-n);else cout<<k1-n<<"/"<<n;return 0; }