您好,登錄后才能下訂單哦!
造成并發(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ì)的方式
免責(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)容。