91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP 并發過程中的數據樂觀鎖

發布時間:2020-06-20 19:29:13 來源:網絡 閱讀:5695 作者:佛觀一杯水 欄目:web開發

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

假設數據庫設計

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

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

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

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

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

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

......

php 代碼:

<?php

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

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

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

$number =5;//定義查詢次數,避免出現死循環

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);就直接執行SQL語句

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

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

 coding........

當你的業務邏輯做完后要更新id 為1排班號狀態的時候

$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');

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

}catch(Exception $e)

{

mysql_query('rollback');

}

mysql_query('end');

}

break;

?>

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




向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

广宗县| 石阡县| 武隆县| 梁平县| 临海市| 新野县| 湖北省| 丹巴县| 石棉县| 凤台县| 祁门县| 金山区| 大城县| 惠东县| 厦门市| 九龙城区| 河源市| 屏东县| 佛冈县| 运城市| 宝兴县| 马公市| 金平| 乌海市| 高州市| 潞西市| 民乐县| 叶城县| 石家庄市| 集安市| 凉城县| 南平市| 芦溪县| 嘉善县| 洪洞县| 通山县| 三门县| 拜城县| 黄石市| 保德县| 延长县|