事務屬性 隔離級別 樂觀鎖 悲觀鎖

2021-10-05 02:06:33 字數 1320 閱讀 5404

事務是為解決應用程式並行問題產生的,並不是資料庫天生的。

事務執行要麼全部成功,要麼全部失敗。類似與二進位制,並不是0就是1。

事務執行前後應用程式狀態一致。一致性通常由上層來實現,如正常執行的邏輯關聯(a發生支付動作,餘額就會減少,商戶餘額就會增加)或者回滾中的反向操作。

不同事務執行互不影響

事務執行成功後,狀態變化是永久的。即使資料庫故障(斷電)等也不能更改狀態

隔離級別可以簡單理解為對讀寫鎖的控制,詳見下圖

只有寫事務提交的資料才可以讀,這樣可以防止髒讀,如圖2。如果讀事務先執行查詢,中間執行寫事務然後在執行讀事務中的第二次查詢,會導致兩次查詢的資料不一致,也就是不可重複讀,如圖5

讀事務不允許寫事務(針對同一行資料),這樣可以防止不可重複讀,如圖3。如果寫事務新增/刪除同型別的資料(滿足查詢條件就是同型別資料)如查詢age大於18員工個數,讀事務的過程中插入符合條件的一條資料就會導致前後兩次查詢資料不一致,也就是幻讀。幻讀和不可重複讀區別在乙個是資料更新,乙個是新增/刪除資料。

序列化執行事務,不能併發執行,如圖4。序列化效能很低,一般很少使用。

悲觀鎖是指在整個資料處理過程中將資料處於鎖定狀態。悲觀鎖的實現依賴於資料庫提供的鎖機制,也只有資料庫提供的鎖機制才能實現資料的排他性。

mysql innodb為例:

begin;

select age from user where id =

1for update;

update user set status =

1 commit;

在innodb中預設是row-level lock,只有明確低指定主鍵或者索引mysql才會執行row lock,否則將會執行table lock把整個**鎖住。

select

...for id =

1 update #id是主鍵/索引,且id=

1的只存在,否則執行table lock

select

...for id >

1 update #主鍵不明確

select

...for name =

"xx" update #非主鍵/索引

樂觀鎖假設認為資料一般情況下不會造成衝突,只有在資料提交的時候才對資料是否衝突進行檢測。樂觀鎖通常在資料庫**中增加乙個字段(version或者timestamp)實現。在提交資料的時候判斷timestamp是否一致,如果一致就更新,否則就是版本衝突。

事務隔離級別與樂觀鎖 悲觀鎖

1.引入 在多使用者環境中,在同一時間可能會有多個使用者更新相同的記錄,這樣會產生衝突,就會造成併發性問題。衝突型別 1 髒讀 指乙個事務a正在訪問資料,並且對資料進行了修改,但是這種修改還沒有提交到資料庫,這時另乙個事務b也訪問這個資料,而a事務產生了異常,發生了回滾,但是b事務使用的還是a修改後...

Redis 事務(悲觀鎖 樂觀鎖)

1 定義 redis事務是乙個單獨的隔離操作 事務中所有的命令都會被序列化 按照順序執行 事務在執行過程中不會被其他客戶端傳送來的命令請求打斷 2 作用 串聯多個命令防止別的命令插隊 multi 輸入開始命令 exec 執行命令 discard 放棄組隊 刪除掉 3 注意事項 1 multi 命令不...

悲觀鎖樂觀鎖

1 悲觀鎖,正如其名,它指的是對資料被外界 包括本系統當前的其他事務,以及來自外部系統的事務處理 修改持保守態度,因此,在整個資料處理過程中,將資料處於鎖定狀態。悲觀鎖的實現,往往依靠資料庫提供的鎖機制 也只有資料庫層提供的鎖機制才能真正保證資料訪問的排他性,否則,即使在本系統中實現了加鎖機制,也無...