文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

php的几种并发解决方案

2023-09-06 10:09

关注

解决方案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一样,则结束本次流程

来源地址:https://blog.csdn.net/GibeMen/article/details/127960471

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯