数据库的一致性读,赃读,多线程与赃读,ACID,UNDO

赃读

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

示例:

?

package com.nbkj.thread;

public class DityRead {
    private String username = "hsj179540";
    private String password = "123";

    public synchronized void setValue(String username, String password) {
        this.username = username;
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        this.password = password;
        System.out.println("setValue的最终结果是:username:" + this.username + ",password:" + this.password);
    }

    /*synchronized */
    public synchronized void getVlaue() {
        System.out.println("getValue的最终结果是:username:" + this.username + ",password:" + this.password);
    }

    public static void main(String[] args) throws Exception {

        final DityRead dityRead = new DityRead();
        Thread t1 = new Thread(new Runnable() {

            @Override
            public void run() {
                dityRead.setValue("zs", "zsp");
            }
        }, "t1");

        /*
         * Thread t2 = new Thread(new Runnable() {
         *
         * @Override public void run() {
         *
         * } }, "t2");
         */

        t1.start();
        Thread.sleep(1000);
        dityRead.getVlaue();
    }

}

总结:

? 考虑问题的时候一定要考虑问题的整体性,当setValue执行的时候,不想getValue执行,所以getValue也要加锁,这样才能保证同步,不然可能引起赃读。

关系型数据库的四个特性:ACID

原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

1.oracle undo概念:

当执行DML操作的时候,会记录你执行的旧值方便回滚。相当于Ctrl +Z

2.经典错误:snapshot too old

当回滚的时候找不到值,会报错snapshot too old

下图体现了数据库的一致性读 图片不显示的可以复制图片地址到浏览器查看

有问题可以联系我 WX:hsj179540

原文地址:https://www.cnblogs.com/bingshu/p/9321167.html

时间: 2024-10-13 06:21:32

数据库的一致性读,赃读,多线程与赃读,ACID,UNDO的相关文章

数据库的脏读、不可重复读、幻读

文章来源:http://www.bkjia.com/sjkjc/806530.html 数据库的脏读.不可重复读.幻读都和事务的隔离性有关.所以先了解一下事务的4大特性. 事务的4大特性(ACID): 原子性(Atomicity):事务是数据库的逻辑工作单位,它对数据库的修改要么全部执行,要么全部不执行. 一致性(Consistemcy):事务前后,数据库的状态都满足所有的完整性约束. 隔离性(Isolation):并发执行的N个事务是隔离的,一个不影响一个,一个事务在没有commit之前,被修

Java多线程13:读写锁和两种同步方式的对比

读写锁ReentrantReadWriteLock概述 大型网站中很重要的一块内容就是数据的读写,ReentrantLock虽然具有 完全互斥排他的效果(即同一时间只有一个线程正在执行lock后面的任务),但是效率非常低.所以在JDK中提供了一种读写锁 ReentrantReadWriteLock,使用它可以加快运行效率. 读写锁表示两个锁,一个是读操作相关的锁,称为共享锁:另一个是写操作相关的锁,称为排他锁.我把这两个操作理解为三句话: 1.读和读之间不互斥,因为读操作不会有线程安全问题 2.

48.输入任意正整数,编程判断该数是否为回文数(回文数是指从左到右读与从右到左读一样,如12321)

//1.输入一个数,将其每一位分离,并保存如一个数组 //2.判断数组最后录入的一位是第几位 //3.循环判断是否满足回问数的要求 #include<iostream> using namespace std; int main() { int n,temp; int k=0; int a[20]; cout<<"please input an number: "<<endl; cin>>n; for(int i=0;i<20;i+

SQL数据库 “内部一致性错误”

SQL数据库被广泛运用于中小型企业, 作为数据存储的仓库. 但是由于一些故障原因, 会造成sql数据库损坏, 数据丢失. 本文小编就主要谈谈SQL数据库 "内部一致性错误"故障以及sql数据库恢复技术. 故障表现:通过之前备份的数据库进行数据库还原时,出现"内部一致性错误".明明是做了备份,却在还原时发现备份文件是损坏的.这意味着数据库的丢失,后果非常严重. 故障原因分析: 1)备份文件和数据库放在同一个物理硬盘上,硬盘出故障,备份也损坏. 2)备份介质损坏:或者做

多线程之使用读写锁ReentrantReadWriteLock实现缓存系统

简单地缓存系统:当有线程来取数据时,如果该数据存在我的内存中,我就返回数据:如果不存在我的缓存系统中,那么就去查数据库,返回数据的同时保存在我的缓存中. 其中涉及到读写问题:当多个线程执行读操作时(都加读锁),如果有数据返回:如果没有数据时,则让第一个读的线程,进行获取数据,然后进行写操作,这时需要第一个线程先释放掉读锁然后加写锁.第一个写完后,在家读锁,其他线程使用时判断,如果存在该数据,在直接过去读取不用加写锁. API上缓存例子如下: class CachedData { Object d

数据库并发导致的脏读 不可重复读 幻读的处理方法

在做ERP订单接入仓库库存的时候出现了一个问题.下单会读取该商品是否有库存.如果有那么就下单 减去(可下单库存,物理库存不变) 没有则提示库存不足 在并发情况下就会导致 u1用户下单编号为1的商品1个  u2用户也下单编号为1的商品1个.编号为1的商品库存只有1个. 那么当u1在读取出数据的时候发现库存有一个 但是还没有写入库存的操作   u2也下单成功并提交  那么就会导致数据错乱 本来应该是只有u1会下单成功u2则提示库存不足 这里可以用事物的隔离机制或乐观锁来解决 事物是一个逻辑单元 原子

Java读写锁,多线程环境下提升效率

读写锁 package cn.sniper.thread.lock; import java.util.HashMap; import java.util.Map; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; public class Cache {

多线程编程之读写锁

在<多线程编程之Linux环境下的多线程(二)>一文中提到了Linux环境下的多线程同步机制之一的读写锁.本文再详细写一下读写锁的概念和原理. 一.什么是读写锁 读写锁(也叫共享-独占锁)实际是一种特殊的自旋锁,它把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作.这种锁相对于自旋锁而言,能提高并发性,因为在多处理器系统中,它允许同时有多个读者来访问共享资源,最大可能的读者数为实际的逻辑CPU数.写者是排他性的,一个读写锁同时只能有一个写者或多个读

C#使用读写锁解决多线程并发写入文件时线程同步的问题

读写锁是以 ReaderWriterLockSlim 对象作为锁管理资源的,不同的 ReaderWriterLockSlim 对象中锁定同一个文件也会被视为不同的锁进行管理,这种差异可能会再次导致文件的并发写入问题,所以 ReaderWriterLockSlim 应尽量定义为只读的静态对象. 多线程同时写入文件 class Program { static int writeCount = 0; static int wrongCount = 0; static void Main(string