共享鎖和排他鎖主要是為了解決并發導緻的問題。
在PHP中,共享鎖和排它鎖主要用在兩個地方,一個是資料庫,一個是檔案。
PHP對資料庫使用鎖依靠SQL語句
- SELECT 預設不加鎖
- SELECT... LOCK IN SHARE MODE 加共享鎖
- SELECT ... FOR UPDATE 加排它鎖
- UPDATE DELETE INSERT 預設加排它鎖
Msql中共享鎖和排它鎖的差別
假設有事務A,事務B,資料C
- 如果事務
對資料C加上共享鎖後,沒擷取到資料C共享鎖的其他事務(比如事務B)隻能對資料A
再加共享鎖,不能加排他鎖(帶排他鎖的語句不能執行)。C
- 獲準共享鎖的事務隻能讀資料,不能修改資料,比如事務A和事務B都擷取到資料C的共享鎖,則他們都可以讀資料C,但不可以修改資料C,但如果事務A在擷取到資料C共享鎖的前提下再對資料C加排它鎖,則事務A可以對資料C進行讀取和修改。
- 如果事務
對資料A
加上排他鎖後,則其他事務(比如事務B)不能再對資料C
加任何類型的鎖(帶共享鎖和排他鎖的語句都不能執行)。獲準排他鎖的事務(比如事務A)既能讀資料,又能修改資料。C
PHP對檔案使用鎖依靠 flock() 函數
定義和用法
flock() 函數鎖定或釋放檔案。
若成功,則傳回 true。若失敗,則傳回 false。
文法
flock(file,lock,block)
參數 | 描述 |
---|---|
file | 必需。規定要鎖定或釋放的已打開的檔案。 |
lock | 必需。規定要使用哪種鎖定類型。 |
block | 可選。若設定為 1 或 true,則當進行鎖定時阻擋其他程序。 |
說明
flock() 操作的 file 必須是一個已經打開的檔案指針。
lock 參數可以是以下值之一:
- 要取得共享鎖定(讀取的程式),将 lock 設為 LOCK_SH(PHP 4.0.1 以前的版本設定為 1)。
- 要取得獨占鎖定(寫入的程式),将 lock 設為 LOCK_EX(PHP 4.0.1 以前的版本中設定為 2)。
- 要釋放鎖定(無論共享或獨占),将 lock 設為 LOCK_UN(PHP 4.0.1 以前的版本中設定為 3)。
- 如果不希望 flock() 在鎖定時堵塞,則給 lock 加上 LOCK_NB(PHP 4.0.1 以前的版本中設定為 4)。