資料庫事務併發帶來的問題 及並行

2021-07-04 11:08:02 字數 1176 閱讀 3232

併發與並行的區別:

併發

當有多個執行緒在操作時

,如果系統只有乙個cpu

,則它根本不可能真正同時進行乙個以上的執行緒,它只能

把cpu執行時間劃分成若干個時間段,再將時間段分配給各個執行緒執行,在乙個時間段的執行緒**執行時,其它執行緒處於掛起狀。.這種方式我們稱之為併發

(concurrent)。

並行:

當系統有乙個以上

cpu時

,則執行緒的操作有可能非併發。

當乙個cpu執行乙個執行緒時,另乙個cpu可以執行另乙個執行緒,兩個執行緒互不搶占cpu資源,可以同時進行,這種方式我們稱之為並行

(parallel)。

區別:

併發和並行是即相似又有區別的兩個概念,

並行是指兩個或者多個事件在同一時刻發生;而併發是指兩個或多個事件在同一時間間隔內發生。

資料庫事務併發帶來的問題有:更新丟失、髒讀、不可重複讀、幻象讀。

假設張三辦了一張招商銀行卡,餘額100元,分別說明上述情況。

1、更新丟失:乙個事務的更新覆蓋了另乙個事務的更新。事務a:向銀行卡存錢100元。事務b:向銀行卡存錢200元。a和b同時讀到銀行卡的餘額,分別更新餘額,後提交的事務b覆蓋了事務a的更新。更新丟失本質上是寫操作的衝突,解決辦法是乙個乙個地寫。

2、髒讀:乙個事務讀取了另乙個事務未提交的資料。事務a:張三妻子給張三轉賬100元。事務b:張三查詢餘額。事務a轉賬後(還未提交),事務b查詢多了100元。事務a由於某種問題,比如超時,進行回滾。事務b查詢到的資料是假資料。髒讀本質上是讀寫操作的衝突,解決辦法是寫完之後再讀。

3、不可重複讀:乙個事務兩次讀取同乙個資料,兩次讀取的資料不一致。事務a:張三妻子給張三轉賬100元。事務b:張三兩次查詢餘額。事務b第一次查詢餘額,事務a還沒有轉賬,第二次查詢餘額,事務a已經轉賬了,導致乙個事務中,兩次讀取同乙個資料,讀取的資料不一致。不可重複讀本質上是讀寫操作的衝突,解決辦法是讀完再寫。

4、幻象讀:乙個事務兩次讀取乙個範圍的記錄,兩次讀取的記錄數不一致。事務a:張三妻子兩次查詢張三有幾張銀行卡。事務b:張三新辦一張銀行卡。事務a第一次查詢銀行卡數的時候,張三還沒有新辦銀行卡,第二次查詢銀行卡數的時候,張三已經新辦了一張銀行卡,導致兩次讀取的銀行卡數不一樣。幻象讀本質上是讀寫操作的衝突,解決辦法是讀完再寫。

事務併發帶來的問題

髒讀 事務a對某個資料進行修改,但是還沒提交到資料庫中 此時事務b對這個資料進行訪問,我們把b事務訪問到的這個未提交的資料稱為 髒資料 事務b的這種行為稱為 髒讀 丟失修改 事務a和事務b同時對某乙個資料進行訪問,且此時a修改了資料如a a 1,b同時也對a進行修改,a a 1,此時a的修改結果將會...

Mysql關於事務併發帶來的問題

mysql從5.5.8開始,innodb就是預設的儲存引擎,innodb最大的特點是 支援事務 支援行級鎖。既然支援事務,那麼就會有處理併發事務帶來的問題 更新丟失 髒讀 不可重複讀 幻讀 相應的為了解決這四個問題,就產生了事務隔離級別 未提交讀 read uncommitted 已提交讀 read...

MySQL 事務併發帶來的問題與事務隔離機制

一 前言 mysql從5.5.8開始,innodb就是預設的儲存引擎,innodb最大的特點是 支援事務 支援行級鎖。既然支援事務,那麼就會有處理併發事務帶來的問題 更新丟失 髒讀 不可重複讀 幻讀。相應的為了解決這四個問題,就產生了事務隔離級別 讀未提交 read uncommitted 讀已提交...