真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

PHP并發(fā)過程中的數(shù)據(jù)樂觀鎖

造成并發(fā)的原因:有一個叫張三專家很火爆的,假設張三在這周三上午9點到10點之間有問診排班,系統(tǒng)后臺會生成本周三9點到10點的10個專家號,等待患者來定號,但張三太火爆了,結果有1 萬個患者定票

成都創(chuàng)新互聯(lián)公司始終堅持【策劃先行,效果至上】的經(jīng)營理念,通過多達10年累計超上千家客戶的網(wǎng)站建設總結了一套系統(tǒng)有效的網(wǎng)絡營銷推廣解決方案,現(xiàn)已廣泛運用于各行各業(yè)的客戶,其中包括:三維植被網(wǎng)等企業(yè),備受客戶認可。

假設數(shù)據(jù)庫設計

uid(張三) time(時間) number(排班編號)

當一個請求過來的時候張三醫(yī)生的排班號就會減一,這里流程假設有一萬個請求同時請求張三醫(yī)生的排班號,每個請求就會開辟一個進程,就會有一萬個進程同時爭奪張三醫(yī)生的排班號,由于操作系統(tǒng)CPU 在不斷的切換,等待,喚醒,。。。。(具體可以去了解多線程編程)。這樣會造成多進程安全問題。

這時候就要添加樂觀鎖解決問題,在數(shù)據(jù)庫表添加 verison (版本號)(accord)

id  uid  time       number(排班編號) version (版本號)  status(狀態(tài))

1  張三 9:00-9:10    z-0001           001            0

2  張三 9:10-9:20    z-001           002             0

......

php 代碼:

$doctor = $_GET['doctor_id'];//接受醫(yī)生的UID

$number = $_GET['number'];//排班編號

MySQL_query("begin");//開啟MYSQL 事務

$number =5;//定義查詢次數(shù),避免出現(xiàn)死循環(huán)

while(True && ++$i)

{

if($i<$num)

{

try{

$sql = "select version,id,number from accord where uid=".$doctor." and status=0 limit 1";

//假設$database_obj->query($sql);就直接執(zhí)行SQL語句

//這個時候我們拿到了張三醫(yī)生的排班號,假設這里拿到了id 為1的號

$data = $database_obj->query($sql);

 coding........

當你的業(yè)務邏輯做完后要更新id 為1排班號狀態(tài)的時候

$sql = "update accord set status=1 where version=".$data['version']." and id=".$data['id'];

$data = $database_object->query($sql);

if(FALSE==$data)

{

  throw new Exception();//拋出異常

}

//如果成功就提交

mysql_query('commit');

關鍵:這個時候由于是并發(fā)數(shù)據(jù)請求,CPU 做不停的切換,進程在執(zhí)行到這里的時候操作系統(tǒng)的執(zhí)行權交給其他的進程,當前進程就處于等待狀態(tài),id 為一的排班狀態(tài)被修改占用,SQL 語句執(zhí)行失敗

}catch(Exception $e)

{

mysql_query('rollback');

}

mysql_query('end');

}

break;

?>

以上就是樂觀鎖的原理,但根據(jù)自己的業(yè)務需要可以做如下改動,個人認為樂觀鎖并不是處理并發(fā)數(shù)據(jù)最好的方法。下面會介紹列隊的方式


當前標題:PHP并發(fā)過程中的數(shù)據(jù)樂觀鎖
文章地址:http://weahome.cn/article/jhsoop.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部