Web開發系列(十):事務和鎖
事務
事務,有哪四個特性?想必十有八九在面試中問過這個問題:
- 原子性(Atomicity):事務作為一個整體被執行,包含在其中的對資料庫的操作要麼全部被執行,要麼都不執行
- 一致性(Consistency):事務應確保資料庫的狀態從一個一致狀態轉變為另一個一致狀態。一致狀態的含義是資料庫中的資料應滿足完整性約束
- 隔離性(Isolation):多個事務併發執行時,一個事務的執行不應影響其他事務的執行
- 永續性(Durability):已被提交的事務對資料庫的修改應該永久儲存在資料庫中
ACID 是資料庫事務滿足的四個特性,在哪些地方需要用到事務呢?例如在資料庫中併發更新一個商品的點贊數,通常的做法是:
- 取出當前的點贊數
- +1
- 把+1之後的值寫入資料庫
如果這中間存在併發,而恰好CPU排程到另一個程序中執行,資料就有可能紊亂。事務便是因此而生的,事務保證了一系列動作要麼全都被 執行,要麼全都沒有執行。
鎖
為了保證併發更新的資料準確性,我們就需要了解到鎖這個概念,即,想要修改這個資料,必須要先持有鎖,鎖的持有者可以更新資料, 其他的只能等待下一次奪取鎖。
鎖在實現方式上分為樂觀鎖和悲觀鎖,樂觀鎖即認為衝突很少發生,所以每次都會先複製一份先前的資料,記錄下時間戳,等到更新資料 的時候,則檢查資料是否已經被更改過,如果沒有,則更新,否則則回滾,參見MVCC。而悲觀鎖則相反,採用一種相對保守的策略,悲觀鎖 認為衝突是極有可能大概率發生的,所以在更新資料之前,一定要先拿到鎖才會開始。
參考:
- ofollow,noindex" target="_blank">https://zh.wikipedia.org/wiki/%E6%95%B0%E6%8D%AE%E5%BA%93%E4%BA%8B%E5%8A%A1
- https://en.wikipedia.org/wiki/Multiversion_concurrency_control