悲觀鎖(pessimistic lock)
悲觀鎖的特點是先獲取鎖,再進行業務操作,即「悲觀」的認為獲取鎖是非常有可能失敗的,因此要先確保獲取鎖成功再進行業務操作。通常所說的「一鎖二查三更新」即指的是使用悲觀鎖。通常來講在資料庫上的悲觀鎖需要資料庫本身提供支援,即通過常用的select … for update操作來實現悲觀鎖。當資料庫執行select for update時會獲取被select中的資料行的行鎖,因此其他併發執行的select for update如果試圖選中同一行則會發生排斥(需要等待行鎖被釋放),因此達到鎖的效果。select for update獲取的行鎖會在當前事務結束時自動釋放,因此必須在事務中使用。
這裡需要注意的一點是不同的資料庫對select for update的實現和支援都是有所區別的,例如oracle支援select for update no wait,表示如果拿不到鎖立刻報錯,而不是等待,mysql就沒有no wait這個選項。另外mysql還有個問題是select for update語句執行中所有掃瞄過的行都會被鎖上,這一點很容易造成問題。因此如果在mysql中用悲觀鎖務必要確定走了索引,而不是全表掃瞄。
樂觀鎖(optimistic lock)
樂觀鎖的特點先進行業務操作,不到萬不得已不去拿鎖。即「樂觀」的認為拿鎖多半是會成功的,因此在進行完業務操作需要實際更新資料的最後一步再去拿一下鎖就好。
樂觀鎖在資料庫上的實現完全是邏輯的,不需要資料庫提供特殊的支援。一般的做法是在需要鎖的資料上增加乙個版本號,或者時間戳,
demo:
表結構:
create table `goods` (
`id` int(11) not null auto_increment comment '自增id',
`name` varchar(64) default null comment '商品名稱',
`count` int(11) default null comment '商品數量',
`price` float default null comment '商品**',
`version` int(11) default null comment '資料版本號',
`create_time` datetime default null comment '建立時間',
`update_time` datetime default null comment '更新時間',
primary key (`id`)
) engine=innodb auto_increment=3 default charset=utf8
悲觀鎖(php 實現):
<?php
date_default_timezone_set('asia/shanghai');
$db = new mysqli('127.0.0.1','root','792a1d086a2b0a5d','test',3306);
$bugnum = 3;
$locksql = "lock table `goods` write";
$unlocksql = "unlock tables";
$lockres = $db->query($locksql);
if (!$lockres) else
$sql = "select * from goods where id = 1";
$res = $db->query($sql);
while($value = $res->fetch_assoc()) else else }}
sleep(20);
$unlockres = $db->query($unlocksql);
if (!$unlockres) else
$db->close();
樂觀鎖(php實現):
<?php
date_default_timezone_set('asia/shanghai');
$db = new mysqli('127.0.0.1','root','792a1d086a2b0a5d','test',3306);
$buynum = 3;
$sql = "select * from goods where id = 1";
$res = $db->query($sql);
while($value = $res->fetch_assoc()) else else }}
sleep(10);
$db->close();
悲觀鎖樂觀鎖
1 悲觀鎖,正如其名,它指的是對資料被外界 包括本系統當前的其他事務,以及來自外部系統的事務處理 修改持保守態度,因此,在整個資料處理過程中,將資料處於鎖定狀態。悲觀鎖的實現,往往依靠資料庫提供的鎖機制 也只有資料庫層提供的鎖機制才能真正保證資料訪問的排他性,否則,即使在本系統中實現了加鎖機制,也無...
樂觀鎖 悲觀鎖
悲觀鎖 pessimistic lock 顧名思義,就是很悲觀,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會block直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。樂觀鎖 optim...
樂觀鎖 悲觀鎖
樂觀鎖 悲觀鎖 悲觀鎖 pessimistic locking 悲觀鎖,正如其名,它指的是對資料被外界 包括本系統當前的其他事務,以及來自外部系統的事務處理 修改持保守態度,因此,在整個資料處理過程中,將資料處於鎖定狀態。悲觀鎖的實現,往往依靠資料庫提供的鎖機制 也只有資料庫層提供的鎖機制才能真正保...