髒讀和資料庫一致性的分析

2021-08-09 20:28:34 字數 1564 閱讀 8358

package demo;

/* 髒讀:資料不一致的錯誤。

* * 在對乙個物件的方法加鎖的時候,需要考慮業務的整體性,

* 在demo中為setuser/getuser方法同時加鎖synchronized同步關鍵字,

* 保證業務的原子性,不然會出現業務錯誤。

* */

public

class

dirtyread catch (exception e)

this.password = password;

system.out.println("there set username : "+username +"---password:----"+password);

}//得到user資訊

public

synchronized

void

getuser()

//test

public

static

void

main(string args) throws interruptedexception

});/*

* 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

場景描述:

乙個使用者a在9:00訪問資料庫表table。查詢乙個資料num=100,假設table資料量1000w

,需要10分鐘才能查詢到num,

然後乙個使用者b , 在9:05訪問資料庫,對資料num進行update,num=200。

問:使用者a查詢到的資料num的值,是100還是200?

比如說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,這就是關係型資料庫的一致性表示。

快取和資料庫一致性

對應比較常用的資料,比如鑑權資料一般會放在快取中 比如 redis 這樣能夠跟快的實現讀取,所以一般讀取流程如下 目前網上有很多關於快取和資料庫怎麼保持一致性的文件,主要可以總結為如下幾點 1 先更新資料庫,在更新快取 2 先刪除快取,在更新資料庫 3 先更新資料庫,在刪除快取 下面將對著幾種機制作...

資料讀一致性

undo段由兩個元件組成 undo頭和undo入口。undo段的第一塊是undo頭。undo被建立時僅有undo頭被建立。保留時間表 retention table 這是自動管理undo新增的乙個元件。儲存了undo段中每乙個區最後乙個事務提交的時間。事務表 transaction table 儲存...

MySQL 資料庫的一致性讀

mysql 在不同的事務隔離級別下提供兩種讀模式 一致性讀 非加鎖 當前讀 加鎖讀 一致性讀 利用mvcc機制讀取到某個事務已經提交的資料,其實是從undo裡面獲取的資料快照 事務的概念 由一組dml語句組成,要麼全部成功,要麼全部失敗。事務的acid 事務的併發問題 事務的隔離級別 隔離級別 髒讀...