天天看點

PHP 中的共享鎖和排它鎖

共享鎖和排他鎖主要是為了解決并發導緻的問題。

在PHP中,共享鎖和排它鎖主要用在兩個地方,一個是資料庫,一個是檔案。

PHP對資料庫使用鎖依靠SQL語句

  1. SELECT 預設不加鎖
  2. SELECT... LOCK IN SHARE MODE 加共享鎖
  3. SELECT  ...  FOR UPDATE  加排它鎖
  4. UPDATE  DELETE  INSERT  預設加排它鎖

Msql中共享鎖和排它鎖的差別

         假設有事務A,事務B,資料C

  1. 如果事務

    A

    對資料C加上共享鎖後,沒擷取到資料C共享鎖的其他事務(比如事務B)隻能對資料

    C

    再加共享鎖,不能加排他鎖(帶排他鎖的語句不能執行)。
  2. 獲準共享鎖的事務隻能讀資料,不能修改資料,比如事務A和事務B都擷取到資料C的共享鎖,則他們都可以讀資料C,但不可以修改資料C,但如果事務A在擷取到資料C共享鎖的前提下再對資料C加排它鎖,則事務A可以對資料C進行讀取和修改。
  3. 如果事務

    A

    對資料

    C

    加上排他鎖後,則其他事務(比如事務B)不能再對資料

    C

    加任何類型的鎖(帶共享鎖和排他鎖的語句都不能執行)。獲準排他鎖的事務(比如事務A)既能讀資料,又能修改資料。

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)。