php的几种并发解决方案

解决方案1:文件锁

一.阻塞模式:(只要有其他进程已经加锁文件,当前进程会一直等其他进程解锁文件)

public function index(){
f p = f o p e n ( " l o c k . t x t " , " w + " ) i f ( f l o c k ( fp = fopen("lock.txt","w+") if(flock( fp=fopen("lock.txt","w+")if(flock(fp,LOCK_EX))
{
// 处理业务逻辑

   flock($fp,LOCK_UN);              
}
fclose($fp)

}
基础介绍:
1.读写方式打开或者创建文件lock.txt 文件
2.给lock.txt文件上"独占锁",上锁成功可进行下一步逻辑
3.处理完数据后,释放锁,以及fclose关闭打开的文件

二.非阻塞模式:(只要有其他进程已经加锁文件,当前进程不会等其他进程解锁文件直接返回)

public function index()
{
f p = f o p e n ( " l o c k . t x t " , " w + " ) i f ( f l o c k ( fp = fopen("lock.txt","w+") if(flock( fp=fopen("lock.txt","w+")if(flock(fp,LOCK_EX|LOCK_NB))
{
// 处理业务逻辑
flock(KaTeX parse error: Expected 'EOF', got '}' at position 18: …,LOCK_UN); }̲ fclose(fp)
}
php 函数 flock解释:
语法:flock(file,lock,block)
参数1:file 必需。规定要锁定或释放的已打开的文件
参数2:lock 必需。规定要使用哪种锁定类型。
LOCK_SH - 共享锁定(读取的程序)。允许其他进程访问该文件
LOCK_EX - 独占锁定(写入的程序)。防止其他进程访问该文件
LOCK_UN - 释放一个共享锁定或者独占锁定
LOCK_NB - 锁定的情况下避免阻塞其他进程
参数3:block 选填。若设置为1,则当进行锁定时阻塞其他进程。

解决方案2:Mysql 锁机制(GET_LOCK)

优点:可解决用户个人并发及事件并发
select GET_LOCK(‘code.1.2022-09-27’,10) // 加锁
select RELEASE_LOCK(‘code.1.2022-09-27’) // 解锁
select IS_FREE_LOCK(‘code.1.2022-09-27’) // 返回当前连接id,表示锁正在被使用 返回0 表示占用
select IS_USED_LOCK(‘code.1.2022-09-27’) // 可以查看目前占用该锁的连接id
缺点:会叠加锁,当出现叠加情况下,需要执行多次删除锁操作

解决方案3:悲观锁|乐观锁

悲观锁:假设数据肯定会冲突,所以在数据开始读取的时候就把数据锁定住
存储引擎必须是innodb类型,必须在事务中执行
加上for update查询表id=10数据,这条数据就被锁定了,第一个获得锁的,后面的人
只能等待第一个人完成事务提交后才能获得锁进行操作。
案例:
select * from user where id = 10 for update
注意点:MySQL InnoDB默认行级锁,行级锁都是基于索引的,如果一条sql语句没用到索引
就不会使用。

乐观锁:乐观锁假设认为数据一般情况下不会造成冲突,使用在数据进行更新的时候,才会
正式对数据的冲突与否进行检测,如果发现冲突了,则返回用户错误信息。
案例:
一般实现乐观锁的方式就是使用数据版本
假设user表中有三个字段,分别为id,v1,v2
先读task表数据,得到v1,v2的值进行比对,不相等则走回滚
相等则更新v2的值如:v2 = v2 + 1,然后走业务逻辑
当业务逻辑走完之后,将v1的值也修改跟v2一样,则结束本次流程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小塔猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值