PHP 併發過程當中的數據樂觀鎖

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

假設數據庫設計
mysql

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

當一個請求過來的時候張三醫生的排班號就會減一,這裏流程假設有一萬個請求同時請求張三醫生的排班號,每一個請求就會開闢一個進程,就會有一萬個進程同時爭奪張三醫生的排班號,因爲操做系統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 代碼:ide

<?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;

?>

以上就是樂觀鎖的原理,但根據本身的業務須要能夠作以下改動,我的認爲樂觀鎖並非處理併發數據最好的方法。下面會介紹列隊的方式

相關文章
相關標籤/搜索