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如何解决并发问题相关推荐

  1. activeMQ高并发发送消息异常解决方法

    高并发发送消息异常解决方法: 现象:使用10个线程每100ms发送一条消息,大约3000多条后,出现异常,所有线程停 止: javax.jms.JMSException:Could not conne ...

  2. 高并发架构系列:如何解决Redis雪崩、穿透、并发等5大难题

    别人用手机刷新闻.刷段子,你用手机刷知识.你会的越多,成功率就越高. 本篇分享大型网站高并发架构设计是如何解决Redis雪崩.穿透.并发等5大难题的,以下,enjoy~ 缓存雪崩 数据未加载到缓存中, ...

  3. 利用锁机制解决商品表和库存表并发问题

    利用锁机制解决商品表和库存表并发问题 参考文章: (1)利用锁机制解决商品表和库存表并发问题 (2)https://www.cnblogs.com/hgj123/p/4817923.html 备忘一下 ...

  4. 高并发解决方案——提升高并发量服务器性能解决思路

    一个小型的网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构.性能的要求都很简单.随着互联网业务的不断丰富,网站相关的技术经过 ...

  5. 如何解决网站大流量和高并发问题?

    大流量:上千万台客户端同时请求服务器 高并发:并发是因为单台服务器已经完全不能满足大流量的需求,所以需要多台服务器共同处理请求,来缓解单台服务器的压力.异地部署服务器也可以用来进行容灾 高并发概念(Q ...

  6. 并发初体验,解决小规模并发下单问题

    并发初体验,解决小规模并发下单问题 参考文章: (1)并发初体验,解决小规模并发下单问题 (2)https://www.cnblogs.com/Sinte-Beuve/p/7631745.html 备 ...

  7. UDP的epoll并发框架-UDP Listener解决OpenUOM的并发问题

    写于2016/01/21 参加完小小转学深圳小白鸽幼儿园的入学家长会之后 UDP具有是一种很好的封装协议,比如OpenUOM使用UDP封装会比TCP好很多,现在越来越多的业务采用UDP传输,然后自己定 ...

  8. 搞懂分布式技术30:高并发解决方案——提升高并发量服务器性能解决思路

    高并发解决方案--提升高并发量服务器性能解决思路 一个小型的网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构.性能的要求都很 ...

  9. 哎呀,你对高并发与多线程的解决思路了解的还挺深!

    一.大规模并发带来的挑战 在过去的工作中,我曾经面对过5w每秒的高并发秒杀功能,在这个过程中,整个Web系统遇到了很多的问题和挑战.如果Web系统不做针对性的优化,会轻而易举地陷入到异常状态.我们现在 ...

  10. “并发冲突” 分析与解决

    并发冲突分析与解决      我们都知道,我们计算机中的运算都是交给CPU处理的,如果对于一个单核CPU来说,在绝对的某个时刻内,CPU只能同时完成一个任务,不可能同时的处理多个任务.但是我们都知道, ...

最新文章

  1. 继续昨日计划: 2022-2-16
  2. 添加全局函数$.extend和对象方法$.fn
  3. 如何在 Linux 下乾坤大挪移?
  4. Shell简介:什么是Shell,Shell命令的两种执行方式
  5. 面向对象的三大特征之一:继承
  6. windows与linux网络设置(host-only)
  7. oracle report builder 6i下载,oracle report builder 6i - 数据模型中的SQL查询代码
  8. Java 8:正在运行的CompletableFuture
  9. idea的maven project消失解决方案
  10. Linux内核分析 - 网络[五]:vlan协议-802.1q
  11. UVA 644 - Immediate Decodability
  12. ELK快速搭建一个集中化日志平台
  13. Android零基础入门第86节:探究Fragment生命周期
  14. delphi 获取webbrowser文本框id内数值_分布式 ID 生成策略
  15. 计算机图形学多边形填充代码_计算机图形学 Computer Graphics (第一周笔记及课件翻译)...
  16. 终端出厂后自动化运维方案
  17. 计算机键盘怎样做除法,电脑键盘除法是哪个键?
  18. linux的lilo,深入Linux的LILO
  19. 晶圆划片如何提高切割品质?陆芯半导体告诉你
  20. 情人节表白专用代码,希望你成功

热门文章

  1. 这年头,胡萝卜也靠不住了
  2. Spring源码 --Idea module 相互引用
  3. EJB3.0 JPQL
  4. linux hiredis升级,Redis平滑升级
  5. php 安全包含文件系统,PHP_PHP四大安全策略,一、文件系统安全php如果具有r - phpStudy...
  6. Linux串口编程_termios
  7. oracle数据包对交换机要求,Exalogic Ethernet交换机配置的备份与还原
  8. php5 php4,自动实现php4和php5环境的切换......
  9. mysql 跨库复制_Mysql跨数据库(在同一IP地址中)复制表
  10. c1200 写频软件_摩托罗拉XIR C1200数字对讲机试用——来自HAM族的呼叫