首页 > 其他分享 >脏读:数据一致性问题及解决方案

脏读:数据一致性问题及解决方案

时间:2024-06-12 23:32:39浏览次数:13  
标签:username 事务 解决方案 getValue 脏读 一致性 password public

目录

前言

一、脏读的定义

二、脏读的原因

三、解决脏读的方案

四、Demo讲解


前言

        在多线程或分布式系统中,当多个线程或进程同时访问和修改共享资源时,可能会出现数据不一致的情况。其中一个经典的问题就是脏读。本文将详细介绍脏读的概念、原因和解决方案,帮助读者更好地理解和应对这个常见的数据一致性问题。

一、脏读的定义

        脏读是指一个事务中读取到了另一个并发事务未提交的数据,导致读取到的数据可能是不准确或无效的。脏读可能会导致程序的逻辑错误,甚至数据的损坏。

二、脏读的原因

        脏读的原因主要是由于并发访问共享资源时,读操作与写操作之间的时间差异引起的。当一个事务正在执行写操作时,另一个事务可能会读取到未提交的数据。

主要原因包括:

  • 事务隔离级别不当:数据库提供了不同的事务隔离级别,如读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。如果选择了较低的隔离级别,就容易出现脏读问题。
  • 锁机制不合理:锁机制是保证数据一致性的重要手段。如果没有正确使用锁,就可能导致脏读问题。
  • 代码逻辑错误:在编写程序时,如果没有考虑到并发访问的情况,就可能导致脏读问题。

三、解决脏读的方案

  • 使用合适的事务隔离级别:根据具体业务需求,选择合适的事务隔离级别。一般情况下,推荐使用可重复读或串行化,以确保数据的一致性。
  • 使用锁机制:在并发访问共享资源时,使用锁机制(如读写锁、互斥锁)来控制对资源的访问。通过加锁和解锁操作,确保同一时间只有一个事务能够读取或修改数据。
  • 使用乐观并发控制:乐观并发控制是一种轻量级的并发控制方式,它通过版本号或时间戳等机制来标识数据的版本,并在进行更新操作时比较版本号,以判断是否有其他事务修改了该数据。

四、Demo讲解

对于对象的同步和异步的方法,我们在设计自己的程序的时候,一定要考虑问题的整体,不然就会出现数据不一致的错误,很经典的错误就是脏读(dirtyread)

package com.ctb.demo;

/**
 * 业务整体需要使用完整的synchronized,保持业务的原子性
 * 
 * @author biao
 *
 * 2024年
 */
public class DirtyRead {
	
	private String username = "ctb";
	private String password = "123";
	
	public synchronized void setValue(String username,String password) {
		this.username = username;
		
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		this.password = password;
		
		System.out.println("setValue最终结果:username = "+this.username + ", password = " + this.password);

	}
	
	public void getValue() {
		
		System.out.println("getValue方法得到:username = "+this.username + ", password = " + this.password);

	}
	public static void main(String[] args) throws Exception {
		
		final DirtyRead dr = new DirtyRead();
		Thread t1 = new Thread(new Runnable() {
			
			@Override
			public void run() {
				dr.setValue("zs", "456");
			}
		}); 
		t1.start();
		Thread.sleep(1000);
		
		dr.getValue();
	}

}

结果:

public synchronized void getValue() {
		
		System.out.println("getValue方法得到:
username = "+this.username + ", password = " + this.password);

	}

结果:

注:在代码执行时,main方法下调用线程执行需2s时间,它会继续往下执行,1s后执行getValue()方法,所以需给getValue()方法加锁synchronized,保证整体的一致性。

总结:

        在我们对一个对象的方法加锁的时候,需要考虑业务的整体性,即为setValue/getValue方法同时加锁synchronized同步关键字,保证业务(service)的原子性,不然会出现业务错误(也从侧面保证业务的一致性)

标签:username,事务,解决方案,getValue,脏读,一致性,password,public
From: https://blog.csdn.net/weixin_74268571/article/details/139638668

相关文章

  • 【BUG】鸿蒙模拟器虚拟化问题的解决方案
    找的大佬的教程,有些区别记录在此,以备忘记:创建记事本文档.txt,键入以下代码:pushd"%~dp0"dir/b%SystemRoot%\servicing\Packages\*Hyper-V*.mum>hyper-v.txtfor/f%%iin('findstr/i.hyper-v.txt2^>nul')dodism/online/norestart/add-package:"%System......
  • 从零手写实现 nginx-19-HTTP CORS(Cross-Origin Resource Sharing,跨源资源共享)介绍+解
    前言大家好,我是老马。很高兴遇到你。我们为java开发者实现了java版本的nginxhttps://github.com/houbb/nginx4j如果你想知道servlet如何处理的,可以参考我的另一个项目:手写从零实现简易版tomcatminicat手写nginx系列如果你对nginx原理感兴趣,可以阅读:从零......
  • 企业软件商城:SAM解决方案中的关键角色(应该怎么做)
    1.厘清对SAM的认知1.1.SAM的权威理解软件资产管理(SoftwareAssetManagement,简称SAM)是指通过制定和实施政策、流程和工具来有效管理、控制和保护组织的软件资产。SAM不仅仅是简单的资产盘点,还涉及到软件从采购、部署、使用到退役整个生命周期的管理。其核心目标是确保软件......
  • 《吸血鬼幸存者》游戏启动障碍:应对缺失DLL文件的解决方案
    如果你在尝试运行《吸血鬼幸存者》(VampireSurvivors)时遇到提示缺少特定的DLL文件问题,别急!通过重新安装、验证游戏文件、更新系统组件等简易步骤,即刻重返畅玩之旅。以下是直击问题要害的详细解决方案。1.重新安装游戏首先,确保游戏文件没有损坏或不完整,尝试卸载后重新安装......
  • Steam游戏启动受阻:有效应对bcrypt.dll文件缺失的解决方案
    面对Steam游戏启动时“bcrypt.dll文件缺失”的提示,玩家无需沮丧。通过几个简单步骤,包括验证游戏文件、安装必要运行库、系统文件检查等,即可轻松跨越这道障碍,重返游戏战场。本文速递解决方案,助你无缝继续游戏之旅。1.重新安装游戏首先,尝试从Steam库中卸载游戏,然后重新安装。......
  • Unity 2023/Unity 6编辑器文字糊成一片的解决方案
    这是从2023.1开始就有的问题了。本质原因是Unity不知道哪个天才决定的在编辑器文字上使用了SDF渲染。2023.1因为缺乏选项导致几乎不可用;2023.2加了一个锐度选项;后来在论坛里被众人喷了好久之后(很荣幸在这其中出了一份力......
  • 【旅行使身体和灵魂都在路上】智慧旅游解决方案集合推荐,干货满满!
    引言:2024年端午节假期,全国文化和旅游市场总体平稳有序。据测算,全国国内旅游出游合计1.1亿人次,同比增长6.3%;国内游客出游总花费403.5亿元,同比增长8.1%。假期中,群众赛龙舟、吃粽子、唱山歌、赏古曲,传统节日文化内涵与旅游发展深度融合。广东、湖南、浙江、贵州、云南等地......
  • 【精品方案集】人力资源数字化转型解决方案
    引言:人力资源数字化转型解决方案合集资料,旨在为企业提供一套全面、高效的人力资源管理方案,助力企业实现人力资源管理的数字化转型。本合集围绕人力资源数字化、人力资源的数字化转型、数字化人力资源管理系统及HR数字化转型等关键字,涵盖了多个方面,以满足企业不同层次、不同场......
  • LinkedIn账号登录不稳定,有什么有效解决方案?
    LinkedIn是一个面向职场的社交平台,用户可以在这个平台上建立并维护自己的专属人脉,以及发现行业内的最新动态和趋势。Linkedln在全球至少拥有9.2亿用户,然而领英自从2021年起,开始限制中国大陆地区用户使用,进而导致账号登录频繁不稳定或账号登陆不成功的现象,如何有效解决防止类......
  • 换个色调换个心情,龙迅解决方案,机箱副屏接口全兼容
    1:LT8619CHDMI1.4/DualModeDPReceiver(TTL/LVDS)2:LT6911/LT6911C/HDMI1.4Receiver(4/2-PortMIPI/LVDS)3:LT7911DType-C/DPto4/2-PortMIPI/LVDS以下产品图转载自:乔思伯D31机箱MESH副屏版机箱实测–原创分享(新)–Chiphell–分享与交流用户体......