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

脏读

  • 脏读:在业务中读取的数据出现不一致的错误。
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 , 在9:05访问数据库,对数据num进行Update,num=200。
问:用户A查询到的数据num的值,是100还是200?
  • 用户A在9:00发起的查询,他查询到的数据永远只是9:00这一刻数据库的数据,所以是num=100,
  • 为什么?
比如说Oracle数据库中有个Undo的概念,类似于日志,记录修改数据的旧值。
A——9:00发起查询,在9:10查到num=?
B在9:05提交update了num=200。
A在查到num的值的时候,发现num有更改过,数据库就去Undo中找旧值返给A。
就旧值返给A,即使没有,报一个异常snapshot too  old的异常。
数据库让它报异常都不会将num=200返回给A,这就是关系型数据库的一致性表示。
时间: 2024-10-12 10:02:14

脏读和数据库一致性的分析的相关文章

故障分析:数据库一致性关闭缓慢问题诊断

想必我们大家都知道,Shutdown immediate即一致性关闭数据库,数据库下次启动不需要做实例恢复即可open数据库.那么当数据库一致性关闭出现缓慢等状况时,该怎么办呢?那我们就来一起分析一下,数据库一致性关闭缓慢问题. shutdown immediate在数据库中会做哪些操作? 从以上图得知在shutdownimmediate关闭数据库只需要在数据库中强制选择检查点并关闭文件,不需要等待当前事物处理结束,不需要等待当前会话结束,不允许新连接. 引发shutdown immediate

从AdventureWorks学习数据库建模——实体分析

原文:从AdventureWorks学习数据库建模--实体分析 最近打算写写数据库建模的文章,所以打算分析微软官方提供的SQL Server示例数据库AdventureWorks,看看这个数据库中有哪些值得学习的地方. 首先我们需要下载安装一个SQL Server数据库引擎,然后下载示例数据库,这里笔者用的是SQL2008R2,所以下载的是AdventureWorks2008R2,下载地址: http://msftdbprodsamples.codeplex.com/ 下载数据库后附加到SQL

Oracle不同数据库间对比分析脚本_oracle

正在看的ORACLE教程是:Oracle不同数据库间对比分析脚本. Oracle数据库开发应用中经常对数据库管理员有这样的需求,对比两个不同实例间某模式下对象的差异或者对比两个不同实例某模式下表定义的差异性,这在涉及到数据库软件的开发应用中是经常遇到的.一般数据库软件的开发都是首先在开发数据库上进行,开发到一定程度后,系统投入运行,此时软件处于维护阶段.针对在系统运行中遇到的错误.bug等,还有应用系统的升级,经常需要调整后台程序,数据库开发人员经常遇到这样一种尴尬的事情,维护到一定时期,开发库

数据库一致性备份

本文主要讲解数据库一致性备份的执行步骤,备份数据库是指备份数据库的所有数据文件和控制文件,另外还有参数文件和口令文件.注意:备份数据库时 不需备份重做日志文件. 数据库的一致性备份是指:数据库一致性备份是指关闭了数据库后备份所有数据文件和控制文件的方法.当使用SHUTDOWN 命令正常关闭了数据库之后,所有数据库文件的当前SCN 值完全一致,所以关闭后的数据库备份被称为数据库一致性备份或者冷备份.适用:ARCHIVELOG.NOARCHIVELOG 一 列出要备份的数据文件和控制文件. SQL>

Oracle数据库一致性读原理简介

在Oracle数据库中,undo主要有三大作用:提供一致性读(Consistent Read).回滚事务(Rollback Transaction)以及实例恢复 (Instance Recovery). 一致性读是相对于脏读(Dirty Read)而言的.假设某个表T中有10000条记录,获取所有记录需要15分钟时间.当前时间为9点整,某用户A 发出一条查询语句:select * from T,该语句在9点15分时执行完毕.当用户A执行该SQL语句到9点10分的时候,另外一个用户B发出了一条 d

缓存与数据库一致性保证

本文主要讨论这么几个问题: 1.啥时候数据库和缓存中的数据会不一致 2.不一致优化思路 3.如何保证数据库与缓存的一致性   1需求缘起   上一篇<缓存架构设计细节二三事>引起了广泛的讨论,其中有一个结论:当数据发生变化时,"先淘汰缓存,再修改数据库"这个点是大家讨论的最多的. 上篇文章得出这个结论的依据是,由于操作缓存与操作数据库不是原子的,非常有可能出现执行失败.      假设先写数据库,再淘汰缓存:第一步写数据库操作成功,第二步淘汰缓存失败,则会出现DB中是新数据

Oracle数据库数据对象分析(中)

oracle|对象|数据|数据库 完整性约束 完整性约束用于增强数据的完整性,Oracle提供了5种完整性约束: Check NOT NULL Unique Primary Foreign key 完整性约束是一种规则,不占用任何数据库空间.完整性约束存在数据字典中,在执行SQL或PL/SQL期间使用.用户可以指明约束是启用的还是禁用的,当约束启用时,他增强了数据的完整性,否则,则反之,但约束始终存在于数据字典中. 禁用约束,使用ALTER语句 ALTER TABLE table_name DI

mysql数据库查询优化:分析业务流程细节

上两周一直想办法提高查询速度,取得一点效果,解决了部分问题,记下来以便将来自己查看. 由于公司没有专门的DBA,我自己对mysql数据库也不是很熟悉,而且这个JAVA开发的网络审计系统的管理系统,是经过了N多人几年时间的修修改改,今天到我们手里,要改成能支持大流量情况的版本,所以对我们这个只有几个人的JAVA组来说,确实是个难题. 这个大流量的情况在以前的文章里也提到过,就是要支持每秒钟处理1G左右的网络数据包,HTTP协议的数据包最多,因此HTTP协议分析模块的流水日志表记录最大,据估算可能到

MySQL数据库一致性验证工具pt-table-checksum(Percona Toolkit )

https://www.percona.com/doc/percona-toolkit/2.2/pt-table-checksum.html Percona Toolkit 时 Percona公司提供的一个数据库管理工具包,包括常用的数据一致性验证.差异补齐.查找重复索引.分析二进制日志信息等,大大方便DBA查找和解决问题.优化数据库性能.但是作为一款工具,其使用仍然可能会对数据库产生影响,所以在使用该工具包执行任何操作执行,都需要完整的数据库备份. 以下内容主要从官档摘录. Percona T