国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

Mysql悲觀鎖和樂觀鎖的使用示例

2020-01-18 20:39:36
字體:
來源:轉載
供稿:網友

悲觀鎖

悲觀鎖,認為數據是悲觀的。當我們查詢數據的時候加上鎖。防止其他線程篡改,直到對方拿到鎖,才能修改。

比如,有如下的表。status=1表示可以下單,status=2表示不可以下訂單。假如在并發的過程中有兩個用戶同時查到status=1,那么從邏輯上來說都可以去新增訂單,但是會造成商品超賣。

如下例子

CREATE TABLE `goods` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `status` tinyint(4) DEFAULT NULL, `version` int(11) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4INSERT INTO demo.goods (id, name, status, version) VALUES (1, 'test', 1, 1);

session1執行

set autocommit=0;begin;select *from goods where id=1 and goods.status=1 for update ;update goods set status=2 where id=1;

session2執行

begin;select * from goods where id=1 for update;

這時候session2是阻塞的,因為鎖還在session1,所以鎖一直在等待。如果session1一直不提交,那么session2將在一定時間后超時斷開連接,并且報

(1205, ‘Lock wait timeout exceeded; try restarting transaction')錯誤,

具體的鎖等待時間可以通過設置innodb_lock_wait_timeout參數進行控制。

如果此時在session1中執行commit 操作,那么session2將得到查詢結果,并把鎖交給session2。

我們還可以通過

show status like 'innodb_row_lock_%';

來進一步查看鎖信息。

樂觀鎖

樂觀鎖不同于悲觀鎖,樂觀鎖是通過自身的程序實現,而不是mySql自身實現。

樂觀鎖查詢的時不上鎖,只有在更新的時候檢查版本號。

比如我們查詢到goods表中version 為1 那么在更新這個表的時候Sql將是

select * from goods where id=1;update goods set status=2,version=version+1 where id=1 and version=1;

這里的version是查詢時候的版本號,每次更改將會導致version+1。如果版本號不匹配更新將不成功。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 灵丘县| 永新县| 北安市| 永州市| 延吉市| 东乡族自治县| 甘德县| 盐山县| 遂宁市| 德格县| 吉安市| 互助| 蓝田县| 福安市| 曲松县| 通化市| 垣曲县| 阳谷县| 宁南县| 璧山县| 剑河县| 元阳县| 江华| 霍城县| 伊宁县| 微山县| 高邮市| 阜平县| 大兴区| 绥江县| 禹城市| 图木舒克市| 萨嘎县| 藁城市| 华坪县| 错那县| 南岸区| 民权县| 盐亭县| 洛扎县| 崇仁县|