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)。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值