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 事務的併發問題 事務的隔離級別 隔離級別 髒讀...