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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/244040.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

没有眼睛的街头卖艺人

这是我在潘家园旧货市场附近拍的一组照片。我犹豫再三还是把它贴出来了,因为在我拍摄的时候都曾感到不自然,像是对他残疾的一种伤害。因为无意中用了闪光灯,灯光闪过,他忽然停下手,转过头来,朝着我&#xf…

alchemy php,Flask SQLAlchemy

在Flask Web应用程序中使用原始SQL对数据库执行CRUD操作可能很乏味。 相反,Python工具包SQLAlchemy是一个功能强大的OR映射器,为应用程序开发人员提供了SQL的全部功能和灵活性。 Flask-SQLAlchemy是Flask扩展,它将对SQLAlchemy的支持添加到Fl…

树根上的羊头

这是我在内蒙古兴安盟好仁乡政府院内见到的一棵百年榆树根。当地人招待我们专门杀了一只羊,将羊头放在了榆树根上。据说当地人不吃羊头,也有说是一种仪式。

php 四舍五入百位,php取整函数ceil,floor,round,intval函数的区别

1、ceil — 进一法取整说明float ceil ( float $value )返回不小于 value 的下一个整数,value 如果有小数部分则进一位。ceil() 返回的类型仍然是 float,因为 float 值的范围通常比 integer 要大。ceil() 例子echo ceil(4.3); // 5echo ceil(9.999); // …

看新排美国话剧《哗变》

广西师范大学出版社出版的小说中文版封面昨晚看了话剧《哗变》的首演。是根据美国剧作家诺尔曼沃克的小说《凯恩号哗变记》改编。1988年北京人艺曾演出。而这次出演的演员除冯远征外都为新面孔,导演为任鸣。前两年曾看过电影,相比起来还是话剧过瘾。这个…

辽宁绥中南江港海边

这是位于辽宁兴城和河北秦皇岛之间的一个小渔港,当地人叫“南江港”。此地据说民风朴素,生活几乎自给自足,所以村里显得非常安静、和谐。渔民们出海回来,卸下网来的鱼虾,虽然收获不大,但还是兴致勃勃。渔民…

php导出照片,Laravel使用 Laravel Excel文件导出图片功能

Laracel 中可以使用Laravel Excel进行Excel或者PDF的导出,使用composer进行安装此差价,Laravel-Excel将PHPExcel进行封装。其官方文档:http://www.maatwebsite.nl/laravel-excel/docs其中并未解释出如何导出图片excel其实是可以使用PHPExcel的…

奇特的恐怖之门:谈周德东的恐怖小说《门》

在中国恐怖小说领域,周德东无疑是真正的“王”,什么王?段子王。这不是自诩自封的。据我所知,周德东写恐怖小说已经6、7年了,却总有讲不完的故事,他就像变魔术一样随时会抖出一个段子,让你冷不丁…

炫技式的精彩对辩撑起《哗变》

看了重排话剧《哗变》的首演。是根据美国剧作家诺尔曼沃克的小说《凯恩号哗变记》改编。1988年北京人艺曾演出,由著名演员朱旭主演。而这次出演的演员除冯远征外大都为新面孔(至少对我来说是),导演为任鸣,朱旭则作为艺…

php数组变量太大后台返回500,PHP max_input_var设为了1000导致post数组太多时无法接受后面的参数值...

PHP max_input_var设为了1000导致post数组太多时无法接受后面的参数值下午突然接到格力电话说无法批量设置门店任务,但是在测试环境下无法重现,测试环境下好好的。然后登陆到生产环境下,选择了几个保存也是正常的。但是当全部提交的时候就会不…

看了《猫科动物》

今晚在先锋剧场看了话剧《猫科动物》。20出头的女孩武瑶编剧并执行导演。王迪、党浩出演。果然小说戏剧工作室策划。小剧场。 剧中人物只有一男一女,却扮演着几种不同年龄、职业、性格的角色,角色的变化只是通过服装的变化和演员的表演甚至语气。故事断片…

洋妞包饺子

法国朋友杰明办的汉语学堂今天组织学生学包饺子。众西洋美女起上阵,包出的饺子五花八门、大小不一、奇形怪状、歪七扭八。但是还挺好吃呢。看她们擀面的方法,像是做匹萨饼。德国女孩莱娜最引人注目。美女手下的饺子不是趴着就是躺着,还有那只…

老外肖像(二)

非常喜欢中国文化的德国人雅尼斯被戏称“芭比娃娃”的德国女孩伊丽莎白德国女孩莱娜波兰小伙克里斯,他的理想是留在中国工作。多才多艺的西班牙人吉尼斯。据说他的祖父是西班牙非常著名的诗人。他则像个画家。而这个时候他更像是一个布道的牧师。

关于恐怖小说“分级”及其他:答《北京娱乐信报》记者张守刚问

1、恐怖小说分级,对目前和未来的国内恐怖小说来说,有必要吗? 我以为没有必要。如果恐怖小说分级,那么其他类型小说甚至所谓严肃小说也要分了,比如对情欲的描写,同样有尺度和分级的问题。分级将会使文学生产…

java set contains用法,Java TreeSet contains()用法及代码示例

Java.util.TreeSet.contains()方法用于检查TreeSet中是否存在特定元素。因此,本质上,它用于检查TreeSet是否包含任何特定元素。用法:Tree_Set.contains(Object element)参数:参数element 是TreeSet的类型。如果TreeSet中不存在此元素&#xf…

万圣节的由来

在西方国家,每年的十月三十一日,有个Halloween,辞典解释为 “The eve of All SaintsDay”,中文译作:万圣节之夜。 关于万圣节,人们或多或少都有了一定的感性认知:知道万圣节期间,许…

旅美华人票友演绎易卜生话剧《玩偶之家》

昨晚看了易卜生的经典话剧《玩偶之家》,拍了几张照片。这个剧从上个世纪初引入中国以来,不知道在中国演出了多少次,它对中国妇女的影响也非常深远。鲁迅在1923年写了《娜拉出走后怎样》的文章。他说:娜拉出走之后,不是…

java面试时候算法题多吗,Java面试必问算法题

面试的时候,栈和队列经常会成对出现来考察。本文包含栈和队列的如下考试内容:(1)栈的创建(2)队列的创建(3)两个栈实现一个队列(4)两个队列实现一个栈(5)设计含最小函数min()的栈,要求min、push、pop、的时间复杂度都是O(1)(6)判断栈的push和p…