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

简介: 脏读脏读:在业务中读取的数据出现不一致的错误。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,这就是关系型数据库的一致性表示。
相关文章
|
2月前
|
Cloud Native OLAP OLTP
在业务处理分析一体化的背景下,开发者如何平衡OLTP和OLAP数据库的技术需求与选型?
在业务处理分析一体化的背景下,开发者如何平衡OLTP和OLAP数据库的技术需求与选型?
128 4
|
2月前
|
SQL 关系型数据库 数据库
事务隔离级别:保障数据库并发事务的一致性与性能
事务隔离级别:保障数据库并发事务的一致性与性能
|
5月前
|
关系型数据库 BI 分布式数据库
PolarDB NL2BI解决方案,让你不懂SQL也能进行数据查询分析并生成BI报表
无需创建和开通资源,在预置环境中免费体验PolarDB MySQL及其NL2BI解决方案
PolarDB NL2BI解决方案,让你不懂SQL也能进行数据查询分析并生成BI报表
|
2月前
|
SQL 关系型数据库 MySQL
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(8.0版本升级篇)
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(8.0版本升级篇)
101 0
|
4月前
|
SQL 关系型数据库 MySQL
后端接口性能优化分析-数据库优化(上)
后端接口性能优化分析-数据库优化
116 0
|
4月前
|
SQL 关系型数据库 MySQL
后端接口性能优化分析-数据库优化(下)
后端接口性能优化分析-数据库优化
74 1
|
7天前
|
消息中间件 缓存 关系型数据库
数据库和缓存如何保证一致性?
数据库和缓存如何保证一致性?
|
7天前
|
存储 搜索推荐 数据库
如何选择合适的矢量数据库:选型指南与案例分析
【4月更文挑战第30天】面对众多矢量数据库,如何选择合适的?本文提供了一份选型指南和案例分析。首先,明确业务需求,如推荐系统、图像检索等场景的不同需求;其次,评估数据量,大型项目需选择支持分布式架构的数据库;再者,关注查询性能、技术成熟度和成本。案例中,电商企业选用Faiss实现高效推荐,而互联网公司则因大规模图像检索选择了Milvus,后者以其扩展性和准确性脱颖而出。选择矢量数据库需综合考虑,结合实际以找到最佳匹配。
|
1月前
|
存储 NoSQL 容灾
数据库非功能需求分析
本文探讨了业务研发在技术设计中如何满足非功能需求,重点关注数据库系统的角色。内容涵盖数据库的可用性、可靠性、性能、可修改性、安全性及成本。文章强调了根据业务场景选择合适的数据类型(如关系型、非关系型、内存型、图数据库和时间序列数据库)以及考虑数据容量和增长速度。对于性能需求,讨论了响应时间、吞吐量和并发处理能力。此外,还提到了升级路径、兼容性、备份方案和成本控制(硬件、软件和人力成本)在数据库管理中的重要性。
27 0
|
2月前
|
SQL 关系型数据库 MySQL
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(数据恢复补充篇)(一)
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(数据恢复补充篇)
32 0