天天看点

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