數據庫樂觀鎖和悲觀鎖例子和分析

1.樂觀鎖:樂觀地認爲每次讀數據別人都不會修改,所以不需要用數據庫鎖
//查出商店中id=1的商品的版本號
select version currentVersion from shop where id=1;
//把id=1的商品庫存減1,並把版本號自增1
update shop set num = num - 1,version = version + 1 where id=1 and version = currentVersion;

2.悲觀鎖:悲觀地認爲每次讀數據別人都會修改,所以要用數據庫鎖
//0.開始事務
begin;
//1.查出商品庫存
select num from shop where id=1 for update;
//2.將商品庫存減1
update items set num = num - 1 where id = 1;
//3.提交事務
commit;
悲觀鎖用了select for update,在事務結束之前其他事務都不能改id=1的數據,
如果id用了索引則只鎖行,沒用索引則會鎖表。

3.數據經常改,使用悲觀鎖,能保證數據正確地按順序被修改,此時用樂觀鎖則會發生很多修改失敗的情況。
  數據不常改,使用樂觀鎖,因爲要改的數據別人基本都不會改,所以不用使用數據庫鎖那麼重,耗性能。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章