php如何解决并发问题,PHP如何解决并发问题
PHP如何解决并发问题
有个问题:
一个进程开启事务对表的某一行做了修改,但还没有提交,另一个进程查询该行数据,获取到的是原始的,这时候上面的事物提交了,我再用这个原始数据的时候就有问题……
那我们该怎么解决这个问题呢?
1、文件锁
如果对该表的更新或插入只有一个文件,这种方式是可以解决的
实现方式如下:
public static functioncbInventoryReserve() {$LOCK_FILE_PATH = $_SERVER[‘DOCUMENT_ROOT‘]."wmsinventoryapi/inventory/InventoryReserve.php";$fp = fopen( $LOCK_FILE_PATH, "r");if (!$fp) {die("Failed to open the lock file!");
}flock ( $fp,LOCK_EX );//需要进行的操作
$params = Flight::request()->getBody();$params = json_decode($params, true);if (! is_array($params) || empty($params)) {
Flight::sendRouteResult(array("error_code" => "40002","error_info" => "params empty"));
}$result = \Inventory\InventoryEngine::getInstance()->inventoryReserve($params);flock ( $fp,LOCK_UN );fclose ( $fp);
Flight::sendRouteResult($result);
}
函数说明 flock()会依参数operation所指定的方式对参数fd所指的文件做各种锁定或解除锁定的动作。此函数只能锁定整个文件,无法锁定文件的某一区域。
参数 operation有下列四种情况:
LOCK_SH 建立共享锁定。多个进程可同时对同一个文件作共享锁定。
LOCK_EX 建立互斥锁定。一个文件同时只有一个互斥锁定。
LOCK_UN 解除文件锁定状态。
LOCK_NB 无法建立锁定时,此操作可不被阻断,马上返回进程。通常与LOCK_SH或LOCK_EX 做OR(|)组合。
单一文件无法同时建立共享锁定和互斥锁定,而当使用dup()或fork()时文件描述词不会继承此种锁定。
返回值 返回0表示成功,若有错误则返回-1,错误代码存于errno。
换言之:
使用共享锁LOCK_SH,如果是读取,不需要等待,但如果是写入,需要等待读取完成。
使用独占锁LOCK_EX,无论写入/读取都需要等待。
LOCK_UN,无论使用共享/读占锁,使用完后需要解锁。
LOCK_NB,当被锁定时,不阻塞,而是提示锁定。
为了更好的移植性,对于文件的打开与关闭我选择了fopen和fclose的组合,但flock的第一个参数要求的是int类型的文件描述符。这里对fopen返回的FILE类型的文件指针进行转换,转换为int型的文件描述符 (假设open函数返回的文件描述符为fd,而fopen返回的文件指针为*fp,则fd等价于fp->_fileno).
2、序列化接口(对象序列化)
所有php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示。unserialize()函数能够重新把字符串变回php原来的值。 序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。
classA {public $one = 1;public functionshow_one() {echo $this->one;
}
}//page1.php:
include("classa.inc");$a = newA;$s = serialize($a);//把变量$s保存起来以便文件page2.php能够读到
file_put_contents(‘store‘, $s);//page2.php:
// 要正确了解序列化,必须包含下面一个文件
include("classa.inc");$s = file_get_contents(‘store‘);$a = unserialize($s);//现在可以使用对象$a里面的函数 show_one()
$a->show_one();?>
3、select *** for update
Select …forupdate语句是我们经常使用手工加锁语句。通常情况下,select语句是不会对数据加锁,妨碍影响其他的DML和DDL操作。同时,在多版本一致读机制的支持下,select语句也不会被其他类型语句所阻碍。
借助for update子句,我们可以在应用程序的层面手工实现数据加锁保护操作。
for update子句的默认行为就是自动启动一个事务,借助事务的锁机制将数据进行锁定。
开启一个事务使用for update
start transaction;
select sum(quantity) from ws_inventory_item where inventory_item_id=86 for update;
再开启另一个事务时,做update 操作的时,只能等待上面的事务,commit才能执行;
start transaction;update ws_inventory_item set quantity = quantity + 1 where inventory_item_id = 86;
原文:http://www.cnblogs.com/sdgf/p/5740998.html
php如何解决并发问题,PHP如何解决并发问题相关推荐
- activeMQ高并发发送消息异常解决方法
高并发发送消息异常解决方法: 现象:使用10个线程每100ms发送一条消息,大约3000多条后,出现异常,所有线程停 止: javax.jms.JMSException:Could not conne ...
- 高并发架构系列:如何解决Redis雪崩、穿透、并发等5大难题
别人用手机刷新闻.刷段子,你用手机刷知识.你会的越多,成功率就越高. 本篇分享大型网站高并发架构设计是如何解决Redis雪崩.穿透.并发等5大难题的,以下,enjoy~ 缓存雪崩 数据未加载到缓存中, ...
- 利用锁机制解决商品表和库存表并发问题
利用锁机制解决商品表和库存表并发问题 参考文章: (1)利用锁机制解决商品表和库存表并发问题 (2)https://www.cnblogs.com/hgj123/p/4817923.html 备忘一下 ...
- 高并发解决方案——提升高并发量服务器性能解决思路
一个小型的网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构.性能的要求都很简单.随着互联网业务的不断丰富,网站相关的技术经过 ...
- 如何解决网站大流量和高并发问题?
大流量:上千万台客户端同时请求服务器 高并发:并发是因为单台服务器已经完全不能满足大流量的需求,所以需要多台服务器共同处理请求,来缓解单台服务器的压力.异地部署服务器也可以用来进行容灾 高并发概念(Q ...
- 并发初体验,解决小规模并发下单问题
并发初体验,解决小规模并发下单问题 参考文章: (1)并发初体验,解决小规模并发下单问题 (2)https://www.cnblogs.com/Sinte-Beuve/p/7631745.html 备 ...
- UDP的epoll并发框架-UDP Listener解决OpenUOM的并发问题
写于2016/01/21 参加完小小转学深圳小白鸽幼儿园的入学家长会之后 UDP具有是一种很好的封装协议,比如OpenUOM使用UDP封装会比TCP好很多,现在越来越多的业务采用UDP传输,然后自己定 ...
- 搞懂分布式技术30:高并发解决方案——提升高并发量服务器性能解决思路
高并发解决方案--提升高并发量服务器性能解决思路 一个小型的网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构.性能的要求都很 ...
- 哎呀,你对高并发与多线程的解决思路了解的还挺深!
一.大规模并发带来的挑战 在过去的工作中,我曾经面对过5w每秒的高并发秒杀功能,在这个过程中,整个Web系统遇到了很多的问题和挑战.如果Web系统不做针对性的优化,会轻而易举地陷入到异常状态.我们现在 ...
- “并发冲突” 分析与解决
并发冲突分析与解决 我们都知道,我们计算机中的运算都是交给CPU处理的,如果对于一个单核CPU来说,在绝对的某个时刻内,CPU只能同时完成一个任务,不可能同时的处理多个任务.但是我们都知道, ...
最新文章
- 继续昨日计划: 2022-2-16
- 添加全局函数$.extend和对象方法$.fn
- 如何在 Linux 下乾坤大挪移?
- Shell简介:什么是Shell,Shell命令的两种执行方式
- 面向对象的三大特征之一:继承
- windows与linux网络设置(host-only)
- oracle report builder 6i下载,oracle report builder 6i - 数据模型中的SQL查询代码
- Java 8:正在运行的CompletableFuture
- idea的maven project消失解决方案
- Linux内核分析 - 网络[五]:vlan协议-802.1q
- UVA 644 - Immediate Decodability
- ELK快速搭建一个集中化日志平台
- Android零基础入门第86节:探究Fragment生命周期
- delphi 获取webbrowser文本框id内数值_分布式 ID 生成策略
- 计算机图形学多边形填充代码_计算机图形学 Computer Graphics (第一周笔记及课件翻译)...
- 终端出厂后自动化运维方案
- 计算机键盘怎样做除法,电脑键盘除法是哪个键?
- linux的lilo,深入Linux的LILO
- 晶圆划片如何提高切割品质?陆芯半导体告诉你
- 情人节表白专用代码,希望你成功
热门文章
- 这年头,胡萝卜也靠不住了
- Spring源码 --Idea module 相互引用
- EJB3.0 JPQL
- linux hiredis升级,Redis平滑升级
- php 安全包含文件系统,PHP_PHP四大安全策略,一、文件系统安全php如果具有r - phpStudy...
- Linux串口编程_termios
- oracle数据包对交换机要求,Exalogic Ethernet交换机配置的备份与还原
- php5 php4,自动实现php4和php5环境的切换......
- mysql 跨库复制_Mysql跨数据库(在同一IP地址中)复制表
- c1200 写频软件_摩托罗拉XIR C1200数字对讲机试用——来自HAM族的呼叫