脏读和数据库一致性的分析

简介: 脏读脏读:在业务中读取的数据出现不一致的错误。package demo;/* 脏读:数据不一致的错误。

脏读

  • 脏读:在业务中读取的数据出现不一致的错误。
package demo;

/* 脏读:数据不一致的错误。
 * 
 *  在对一个对象的方法加锁的时候,需要考虑业务的整体性,
 *  在demo中为setUser/getUser方法同时加锁synchronized同步关键字,
 *  保证业务的原子性,不然会出现业务错误。
 * */
public class DirtyRead {

    private String userName = "lc";
    private String password = "123";

    //设置User的名、密码
    public synchronized void setUser(String userName, String password){
        this.userName = userName;
        try {
            Thread.sleep(3000);

        } catch (Exception e) {
            e.printStackTrace();
        }
        this.password = password;
        System.out.println("There set UserName : "+userName +"---password:----"+password);
    }

    //得到User信息
    public synchronized void getUser(){
        System.out.println("There get UserName : "+userName +"---password:----"+password);
    }

    //test
    public static void main(String[] args) throws InterruptedException {

        final DirtyRead dr1 = new DirtyRead();
        Thread t1 = new Thread(new Runnable() {

            @Override
            public void run() {
                dr1.setUser("Jack", "123456");
            }
        });

        /*
         * t1线程只休眠等待1s,但是在setUser方法中,有Thread.sleep(3000);等待3秒。
         * 也就是说,在set方法还没有执行完,主线程就开始调用getUser方法。
         * 这样就造成了数据的不一致性,脏读
         * */
        t1.start();
        t1.sleep(1000);
        dr1.getUser();
    }
}
getUser方法没有加synchronized时:结果
There get UserName : Jack---password:----123
There set UserName : Jack---password:----123456

getUser方法加上synchronized时:结果
There set UserName : Jack---password:----123456
There get UserName : Jack---password:----123456

关系型数据库中的一致性表现

  • 我们常说的ACID:原子性、一致性、隔离性、永久性
场景描述:
一个用户A在9:00访问数据库表table。查询一个数据num=100,假设table数据量1000W
,需要10分钟才能查询到num,
然后一个用户B , 在905访问数据库,对数据num进行Update,num=200。
问:用户A查询到的数据num的值,是100还是200
  • 用户A在9:00发起的查询,他查询到的数据永远只是9:00这一刻数据库的数据,所以是num=100,
  • 为什么?
比如说Oracle数据库中有个Undo的概念,类似于日志,记录修改数据的旧值。
A——9:00发起查询,在9:10查到num=?
B在905提交update了num=200。
A在查到num的值的时候,发现num有更改过,数据库就去Undo中找旧值返给A。
就旧值返给A,即使没有,报一个异常snapshot too  old的异常。
数据库让它报异常都不会将num=200返回给A,这就是关系型数据库的一致性表示。
相关文章
|
27天前
|
Cloud Native OLAP OLTP
在业务处理分析一体化的背景下,开发者如何平衡OLTP和OLAP数据库的技术需求与选型?
在业务处理分析一体化的背景下,开发者如何平衡OLTP和OLAP数据库的技术需求与选型?
125 4
|
1月前
|
SQL 关系型数据库 数据库
事务隔离级别:保障数据库并发事务的一致性与性能
事务隔离级别:保障数据库并发事务的一致性与性能
|
4月前
|
关系型数据库 BI 分布式数据库
PolarDB NL2BI解决方案,让你不懂SQL也能进行数据查询分析并生成BI报表
无需创建和开通资源,在预置环境中免费体验PolarDB MySQL及其NL2BI解决方案
PolarDB NL2BI解决方案,让你不懂SQL也能进行数据查询分析并生成BI报表
|
26天前
|
SQL 关系型数据库 MySQL
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(8.0版本升级篇)
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(8.0版本升级篇)
96 0
|
3月前
|
SQL 关系型数据库 MySQL
后端接口性能优化分析-数据库优化(上)
后端接口性能优化分析-数据库优化
115 0
|
3月前
|
SQL 关系型数据库 MySQL
后端接口性能优化分析-数据库优化(下)
后端接口性能优化分析-数据库优化
70 1
|
26天前
|
SQL 关系型数据库 MySQL
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(数据恢复补充篇)(一)
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(数据恢复补充篇)
30 0
|
1月前
|
存储 NoSQL 大数据
新型数据库技术在大数据分析中的应用与优势探究
随着大数据时代的到来,传统数据库技术已经无法满足海量数据处理的需求。本文将探讨新型数据库技术在大数据分析中的应用情况及其所带来的优势,为读者解析数据库领域的最新发展趋势。
|
1月前
|
存储 关系型数据库 MySQL
TiDB与MySQL、PostgreSQL等数据库的比较分析
【2月更文挑战第25天】本文将对TiDB、MySQL和PostgreSQL等数据库进行详细的比较分析,探讨它们各自的优势和劣势。TiDB作为一款分布式关系型数据库,在扩展性、并发性能等方面表现突出;MySQL以其易用性和成熟性受到广泛应用;PostgreSQL则在数据完整性、扩展性等方面具有优势。通过对比这些数据库的特点和适用场景,帮助企业更好地选择适合自己业务需求的数据库系统。
|
2月前
|
缓存 NoSQL 关系型数据库
数据库缓存一致性学习笔记(一)
数据库缓存一致性学习笔记(一)

热门文章

最新文章