資料庫事務與併發及鎖的問題

2021-08-31 06:22:56 字數 1144 閱讀 2712

對於事務與併發以前了解了下,也以為自己知道了是怎麼回事。可是最近又被這事務及併發搞得暈乎了(最近腦袋很不好使,缺氧啊),事務為了解決什麼?多個事務的併發又有什麼問題?於是google了,做個筆記,以後忘記了好方便檢視。

一直以來了解得並不清楚,平常我們用得最多的可能就是涉及到兩個表資料操作時為了保證資料的一致性,就會在這些操作時加上事務,因為我們知道事務具有原子性、一致性。

原子性: 事務中的操作為乙個整體, 要麼都做, 要麼都不做. 即一旦事務出錯, 就回滾事務.

一致性: 事務開始前, 資料庫中的資料具有一致性, 事務結束時, 資料庫中的資料仍具有一致性.

隔離性: 乙個事務不能被另乙個事務干擾, 退一步講, 乙個事務被另乙個事務干擾的話, 為了防止出錯, 它就會回滾.

永續性: 事務完成後, 就不能再回滾了, 對資料庫的改動是永久的.

事務所能解決也就是一致性,而不能解決多個事務併發帶來的資料的不正確的問題。比如兩個併發事務同時對一條記錄進行操作,後提交的事務的更新會覆蓋前提交的事務。比如購買扣費時我們得判斷使用者的金額大於物品的**,然後扣除。

select gold from use where id = 1000;  //gold = 1000, price = 1000

if(gold >= price)

當併發時這**就會有問題。

可以用樂觀鎖與悲觀鎖來解決此問題。

[b]1. 樂觀鎖[/b]

將update語句更改為

update user set gold = gold – price where id = 1000 and gold = selectgold

當影響的行不為1時表示資料已經被其他事務更改過了。可以丟擲異常,最好還得有頁面提示使用者。

不過一般的樂觀鎖都是每個資料行有乙個版本號或更改的時間戳,每個更新操作前select 出來,更新時帶上條件並要更改版本號或時間戳。

[b]2. 悲觀鎖[/b]

將select改為

select gold from user where id=1000 for update

這樣多執行緒併發時就在阻塞在select上, 不會進行下一步的操作, 可這也加大的鎖的區域影響了併發效能,一般不建議作用這種形式。

資料庫併發的問題與鎖機制

資料庫鎖機制 共享鎖排他鎖 更新鎖排他鎖 獨佔鎖,exclusive locks 意向鎖 intent locks 計畫鎖 schema locks ddl語句都會加sch m鎖該鎖不允許任何其它session連線該錶。連都連不了這個表了,當然更不用說想對該錶執行什麼sql語句了。requested...

資料庫事務與併發

資料庫事務必須具備acid特徵 1 原子性 指整個資料事務是不可分割的工作單元。只有事務中所有操作執行成功,才算整個事務成功 事務中任何乙個sql語句執行失敗,那麼已經執行成功的sql語句也必須撤銷,資料庫狀態應該退回到執行事務前的狀態。2 一致性 指資料庫事務不能破壞關係資料的完整性以及業務邏輯上...

MySQL資料庫併發與事務相關問題

大多數商業資料庫系統一般都是在表上施加行級鎖。事務就是一組原子性的sql查詢,事務內的語句,要麼全部執行成功,要麼全部執行失敗。隔離級別 髒讀不可重複讀 幻讀read uncommitted read committed repeatable read serializable 兩個或多個事務在同乙...