数据库都有哪些锁
行級鎖
行級鎖是一種排他鎖,防止其他事務修改此行;在使用以下語句時,Oracle 會自動應用行級鎖:
表級鎖
表示對當前操作的整張表加鎖,它實現簡單,資源消耗較少,被大部分 MySQL 引擎支持。最常使 用的 MYISAM 與 INNODB 都支持表級鎖定。表級鎖定分為表共享讀鎖(共享鎖)與表獨占寫鎖 (排他鎖)。
頁級鎖
頁級鎖是 MySQL 中鎖定粒度介于行級鎖和表級鎖中間的一種鎖。表級鎖速度快,但沖突多,行級
沖突少,但速度慢。所以取了折衷的頁級,一次鎖定相鄰的一組記錄。BDB 支持頁級鎖
數據庫并發策略
并發控制一般采用三種方法,分別是樂觀鎖和悲觀鎖以及時間戳。
樂觀鎖
樂觀鎖認為一個用戶讀數據的時候,別人不會去寫自己所讀的數據;悲觀鎖就剛好相反,覺得自 己讀數據庫的時候,別人可能剛好在寫自己剛讀的數據,其實就是持一種比較保守的態度;時間 戳就是不加鎖,通過時間戳來控制并發出現的問題。
悲觀鎖
悲觀鎖就是在讀取數據的時候,為了不讓別人修改自己讀取的數據,就會先對自己讀取的數據加 鎖,只有自己把數據讀完了,才允許別人修改那部分數據,或者反過來說,就是自己修改某條數 據的時候,不允許別人讀取該數據,只有等自己的整個事務提交了,才釋放自己加上的鎖,才允 許其他用戶訪問那部分數據。
時間戳
時間戳就是在數據庫表中單獨加一列時間戳,比如“TimeStamp”,每次讀出來的時候,把該字 段也讀出來,當寫回去的時候,把該字段加 1,提交之前 ,跟數據庫的該字段比較一次,如果比數 據庫的值大的話,就允許保存,否則不允許保存,這種處理方法雖然不使用數據庫系統提供的鎖 機制,但是這種方法可以大大提高數據庫處理的并發量,以上悲觀鎖所說的加“鎖”,其實分為幾種鎖,分別是:排它鎖(寫鎖)和共享鎖(讀鎖)。
基于 Redis 分布式鎖
獲取鎖的時候,使用 setnx(SETNX key val:當且僅當 key 不存在時,set 一個 key 為 val 的字符串,返回 1;若 key 存在,則什么都不做,返回 0)加鎖,鎖的 value 值為一個隨機生成的UUID,在釋放鎖的時候進行判斷。并使用 expire 命令為鎖添 加一個超時時間,超過該時間則自動釋放鎖。
獲取鎖的時候調用 setnx,如果返回 0,則該鎖正在被別人使用,返回 1 則成功獲取鎖。 還設置一個獲取的超時時間,若超過這個時間則放棄獲取鎖。
釋放鎖的時候,通過 UUID 判斷是不是該鎖,若是該鎖,則執行 delete 進行鎖釋放。
總結
- 上一篇: 被裁员后,35岁程序员找了6份兼职,35
- 下一篇: 解密车厂押注车载人机交互背后:更丰富的形