數(shù)據(jù)庫(kù)管理系統(tǒng)中的并發(fā)控制的任務(wù)是確保在多個(gè)事務(wù)同事存取數(shù)據(jù)庫(kù)中同一數(shù)據(jù)時(shí)不破壞事務(wù)的隔離性和統(tǒng)一性以及數(shù)據(jù)庫(kù)的統(tǒng)一性偏序。
樂(lè)觀鎖(Optimistic Locking)
- 顧名思義,樂(lè)觀鎖表示看待事物比較樂(lè)觀泵殴,默認(rèn)當(dāng)A修改某條數(shù)據(jù)的時(shí)候,不會(huì)有B來(lái)修改這條數(shù)據(jù)单寂,常表現(xiàn)在提交修改的時(shí)候進(jìn)行鎖數(shù)據(jù)贬芥,修改完后解除鎖。
通常情況下配合版本號(hào)version進(jìn)行使用
例如更新庫(kù)存操作宣决,從10更新到9:
update sku set qty=9,version=2 where id = 1 and version=1
更新成功則成功蘸劈,否則拋出錯(cuò)誤異常
悲觀鎖(Pessimistic Lock)
- 顧名思義,悲觀鎖表示一個(gè)人看待事物比較悲觀尊沸,默認(rèn)當(dāng)A來(lái)修改某條數(shù)據(jù)的時(shí)候威沫,會(huì)有其他的人來(lái)修改,因此常表現(xiàn)在查詢的時(shí)候就把數(shù)據(jù)鎖定椒丧,修改完后解除鎖壹甥。
思路:
1.查詢時(shí)候加鎖----對(duì)記錄修改之前
2.加鎖失敗救巷,拋出錯(cuò)誤
3.加鎖成功壶熏,修改數(shù)據(jù)
4.成功,解鎖浦译;失敗棒假,拋異常,解鎖
$db->autocommit(false); // 開(kāi)始事務(wù)
select * from 表明 where 查詢條件 for update; // 修改前的查詢鎖表
update ..........;// 修改
if(修改成功的判斷) {
$db->commit();
} else {
$db->rollback();
}
選擇性使用
1.樂(lè)觀鎖并沒(méi)有真正的加鎖精盅,因此效率高一些帽哑,但更新失敗的幾率也會(huì)大,并發(fā)量高的時(shí)候業(yè)務(wù)失敗的幾率會(huì)大很多叹俏。
2.悲觀鎖是對(duì)數(shù)據(jù)庫(kù)上鎖妻枕,高并發(fā)會(huì)導(dǎo)致數(shù)據(jù)庫(kù)卡頓,進(jìn)而導(dǎo)致服務(wù)器卡頓粘驰,更新的效率比較低屡谐,但業(yè)務(wù)失敗率略低。