日韩视频一区|在线播放日韩|在线电影一区|在线观看免费视频污网站|在线观看最新电影和热门影视剧

高并發下使用鎖處理數據不一致

閱讀:840|發布時間:2019-02-12 15:46:01

這篇文章我們就簡單講解一下文件鎖和數據庫鎖的用法。

共享鎖

接著我們釋放鎖,會發現那個等待的客戶端的更新語句被執行了,釋放鎖的命令:unlock tables;

    我們重新把num修改為1,然后在一個客戶端里面加一個寫鎖,命令:lock table demo write;

    然后在加寫鎖的這個客戶端里面查詢數據,命令:select * from demo; 結果如下:

    然后在加寫鎖的客戶端里面執行更新,把num修改為3,命令:update demo set num = 3 where i = 1; ,結果如下:

    我們發現加了寫鎖的客戶端是可以對數據進行任何操作的,接著我們用另外一個客戶端,對數據進行查詢,命令:select * from demo; 這個時候我們發現客戶端處于等待狀態,并沒有執行讀取,我們強制關閉等待,然后執行更新操作,把num修改為4,命令:update demo set num = 4 where id = 1; 同樣發現也是處于等待狀態,這個時候我們去另外一個客戶端釋放鎖,命令:unlock tables; 這時候我們發現處于等待狀態的更新操作執行了。

    我們模擬真實場景的商品售賣,比如我們現在庫存有10件商品,也就是我們設計demo表中id為1的商品數量num為10,我們購買的時候查詢這個num,如果這個num是0了,那么我們就給用戶提示商品售罄,如果是并發不高一個一個用戶購買,那肯定是沒有問題的,但是如果很多用戶一起下單,就會出現超賣的情況,也就是這個num會變成負數,換句話說就是成功購買的用戶將會超過10個,我們來看代碼:

    代碼比較簡單,相信大家也是可以看懂的,并發數少的時候這個代碼是不會出現問題的,我們直接用apache的ab測試工具,來模擬一百個用戶搶購這10個商品,看看會發生什么情況:

我們在看看數據庫中的num

    這個時候我們發現num竟然變成負數了,也就意味著超賣了3個。

    文件鎖和數據庫鎖一樣,分為讀鎖和寫鎖,也就是共享鎖和排它鎖,還有就是可以有非租塞模式,如果是數據庫鎖的話就是有請求對數據庫加鎖了,那么其它請求需要等待別人完成請求才能執行數據庫操作,文件鎖的非租塞模式就可以不用等待直接返回操作不了數據庫,例如我們都去搶購一個產品,如果別人加鎖了,那么我們就可以得到系統繁忙的提示,相信大家也可以理解這個功能,下面我們直接來實現文件鎖的寫鎖:

    同樣的我們使用ab測試工具進行測試,結果一樣不會發生超賣的情況。

    我們再簡單說一下數據庫按照粒度區分的三種鎖:表級鎖、行級鎖、頁級鎖

行級鎖:只會鎖定要操作的數據,沖突少,但是速度慢,效率低,總結起來就是:開銷大、加鎖慢、粒度最小、會死鎖、沖突最低、并發度高;

特別注意:行級鎖是一種類似建議鎖的機制,使用的時候需要先檢查鎖,也就是每個事務都要在查詢語句里面寫for update,官方的解釋過于簡單,普通select語句默認不加鎖,CUD語句默認寫鎖,想了解更多,自行搜索建議鎖和強制鎖。不同數據庫實現行級鎖的機制不太一樣,mysql的行級鎖是用索引條件加鎖,也就是查詢條件用到了索引就是行鎖,其它的全部表級鎖。

萬動力(www.lu123123.com),專業的logo免費設計在線生成網站,全自動智能化logo設計,商標設計,logo在線生成!

歡迎使用萬動力制作屬于您公司自己的logo,不僅專業而且經濟實惠,全方位滿足您公司品牌化、視覺化的需求。

版權聲明:萬動力所有作品均由本公司及/或權利人授權發布,僅供網友學習交流,未經上傳用戶書面授權,請勿作他用。若您 的權利被侵害,請聯系 fzypzl@outlook.com, 提交 侵權投訴>

在線智能LOGO設計

小提示:按鍵盤 Ctrl + D 也能收藏哦!
¥100
返回頂部
二維碼失效
請點擊刷新
關閉
保存您的LOGO
主站蜘蛛池模板: 中江县| 牡丹江市| 伊宁县| 翁牛特旗| 宁安市| 邵东县| 二连浩特市| 长沙县| 望都县| 大渡口区| 辽源市| 拜泉县| 玉林市| 夏津县| 阿拉善右旗| 韩城市| 广州市| 吉木萨尔县| 浙江省| 顺昌县| 泸水县| 高阳县| 通渭县| 清丰县| 龙南县| 五河县| 四子王旗| 河津市| 临高县| 博白县| 志丹县| 从化市| 汝阳县| 天气| 华安县| 封丘县| 开阳县| 基隆市| 伊吾县| 六盘水市| 邯郸县|