溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2020-06-20 19:29:13 來(lái)源:網(wǎng)絡(luò) 閱讀:5695 作者:佛觀一杯水 欄目:web開(kāi)發(fā)

造成并發(fā)的原因:有一個(gè)叫張三專家很火爆的,假設(shè)張三在這周三上午9點(diǎn)到10點(diǎn)之間有問(wèn)診排班,系統(tǒng)后臺(tái)會(huì)生成本周三9點(diǎn)到10點(diǎn)的10個(gè)專家號(hào),等待患者來(lái)定號(hào),但張三太火爆了,結(jié)果有1 萬(wàn)個(gè)患者定票

假設(shè)數(shù)據(jù)庫(kù)設(shè)計(jì)

uid(張三) time(時(shí)間) number(排班編號(hào))

當(dāng)一個(gè)請(qǐng)求過(guò)來(lái)的時(shí)候張三醫(yī)生的排班號(hào)就會(huì)減一,這里流程假設(shè)有一萬(wàn)個(gè)請(qǐng)求同時(shí)請(qǐng)求張三醫(yī)生的排班號(hào),每個(gè)請(qǐng)求就會(huì)開(kāi)辟一個(gè)進(jìn)程,就會(huì)有一萬(wàn)個(gè)進(jìn)程同時(shí)爭(zhēng)奪張三醫(yī)生的排班號(hào),由于操作系統(tǒng)CPU 在不斷的切換,等待,喚醒,。。。。(具體可以去了解多線程編程)。這樣會(huì)造成多進(jìn)程安全問(wèn)題。

這時(shí)候就要添加樂(lè)觀鎖解決問(wèn)題,在數(shù)據(jù)庫(kù)表添加 verison (版本號(hào))(accord)

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

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

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

......

php 代碼:

<?php

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

$number = $_GET['number'];//排班編號(hào)

mysql_query("begin");//開(kāi)啟MYSQL 事務(wù)

$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";

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

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

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

 coding........

當(dāng)你的業(yè)務(wù)邏輯做完后要更新id 為1排班號(hào)狀態(tài)的時(shí)候

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

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

}catch(Exception $e)

{

mysql_query('rollback');

}

mysql_query('end');

}

break;

?>

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




向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI