這樣理解資料庫併發操作不知是否正確?

時間 2021-06-04 14:50:03

1樓:

你的理解是錯的。

問題1: 現在有2個執行緒同一時刻併發來更新庫存字段 a、b執行緒同時執行 update 表1 set 庫存=庫存-1 where 庫存》0 由於是併發的,那麼是不是說ab兩個執行緒更新時讀到的庫存都是2,由於是同時執行,那麼更新後庫存結果2-1是不是還是1呢? 除非他們是順序執行的庫存結果變成0

資料庫事務的ACID屬性還記得吧?「I」是什麼,Isolation啊。在關係型資料庫裡,不管你把isolation level設定成什麼級別,資料庫都會保證,在執行update操作前對記錄加write lock。

也就是說,兩條執行緒同時update同一條記錄,只有一條會得到write lock。這時另一條執行緒是block的。所以問題一,執行結果是"庫存"欄位為0,而不是1。

問題2:

那同時在併發執行 update 表1 set 庫存=庫存-1,版本號=版本號+1 where 庫存》0 and 版本號=ver_a, update 表1 set 庫存=庫存-1,版本號=版本號+1 where 庫存》0 and 版本號=ver_b,那加版本號這樣有什麼意義呢,結果不還是1嗎? 除非update語句他們是順序執行的

當然有意義。我們假設在時間點T1,兩條執行緒各自讀取得到id = 1的記錄的version = 1。現在兩條執行緒同時執行:

UPDATE

table1

SETquantity

=quantity-1

,version

=version+1

WHEREid=

1AND

version=1

由於剛才說了,update操作必須取得write lock才會執行。所以兩句update操作會順序執行。現在假設執行緒A先得到這條記錄的鎖,它執行update操作會把quantity減一,變為1。

等執行緒A釋放鎖後,執行緒B執行,它會發現WHERE id =1 AND version = 1的記錄已經不存在了,於是失敗。

怎麼簡單地理解資料庫的概念?

舉個資料庫的例子 姓名性別年齡 張三男 21歲 李四男 20歲 王五男 19歲 以上是乙個資料庫的內容。這些資訊可以採用某種檔案形式儲存在計算機磁碟上,如儲存為文字檔案 d names.txt。可以認為是資料庫以檔案的形式儲存在磁碟。之後可以通過命令進行檢索 修改 統計。資料庫檔案和最後的那些操作命...

如何理解資料庫事務中的一致性的概念?

謝謝 我的理解是事務一致性保證資料在commit之前如果沒有錯誤 既違反約束 那麼在commit之後就不應該再出現錯誤。保證事務提交前後的一致性,既所謂從一種正確的狀態轉換為另一種正確的狀態。 看官方文件,這年頭複製來複製去,誤人子弟的太多 check 777 說下愚見,教課書給出的是從乙個一致性狀...

資料庫MVCC中,如何判斷併發事務能否Commit

雷鋒來了 org wiki Optimistic concurrency control事務提交的時候把該事務讀過和寫過的資料重讀一遍,看看看看這些資料是否被修改過,如果沒有被修改就可以提交 這裡可以分3個問題來回答 1.一條記錄的MVCC結構 entry 可以看作 key k1,注釋 txid為1...