django實現悲觀鎖樂觀鎖

前期準備

# 線上賣圖書-圖書表  圖書名字,圖書價格,庫存字段-訂單表: 訂單id,訂單名字# 表準備class Book(models.Model):name = models.CharField(max_length=32)price = models.IntegerField()  #count = models.SmallIntegerField(verbose_name='庫存')class Order(models.Model):order_id = models.CharField(max_length=64)order_name = models.CharField(max_length=32)# 使用mysql
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'lqz','HOST': '127.0.0.1','PORT': '3306','USER': 'lqz','PASSWORD': '123',}
}# 創建lqz數據庫

1.原生mysql悲觀鎖

begin; # 開啟事務select * from goods where id = 1 for update;  # 行鎖# order表中加數據update goods set stock = stock - 1 where id = 1; # 更新commit; #提交事務

2.orm實現上述(悲觀鎖)?

#1  使用悲觀鎖實現下單
@transaction.atomic  # 整個過程在一個事物中---》改兩個表:book表減庫存,訂單表生成記錄
def seckill(request):# 鎖住查詢到的book對象,直到事務結束sid = transaction.savepoint() # 保存點# 悲觀鎖: select_for_update()# 加鎖了--》行鎖還是表鎖? 分情況,都有可能#book = Book.objects.select_for_update().filter(pk=1).first()  # 加悲觀鎖,行鎖,鎖住當前行if book.count > 0:print('庫存可以,下單')# 訂單表插入一條Order.objects.create(order_id=str(datetime.datetime.now()), order_name='測試訂單')# 庫存-1,扣減的時候,判斷庫存是不是上面查出來的庫存,如果不是,就回滾time.sleep(random.randint(1, 4))  # 模擬延遲book.count=book.count-1book.save()transaction.savepoint_commit(sid)  # 提交,釋放行鎖return HttpResponse('秒殺成功')else:transaction.savepoint_rollback(sid) #回滾,釋放行鎖return HttpResponse('庫存不足,秒殺失敗')

3 樂觀鎖秒殺--》庫存還有,有的人就沒成功

# 2 樂觀鎖秒殺--普通版
@transaction.atomic
def seckill(request):# 鎖住查詢到的book對象,直到事務結束sid = transaction.savepoint()book = Book.objects.filter(pk=1).first()  # 沒加鎖count = book.countprint('現在的庫存為:%s' % count)if book.count > 0:print('庫存可以,下單')Order.objects.create(order_id=str(datetime.datetime.now()), order_name='測試訂單-樂觀鎖')# 庫存-1,扣減的時候,判斷庫存是不是上面查出來的庫存,如果不是,就回滾# time.sleep(random.randint(1, 4))  # 模擬延遲res = Book.objects.filter(pk=1, count=count).update(count=count - 1)if res >= 1:  # 表示修改成功transaction.savepoint_commit(sid)return HttpResponse('秒殺成功')else:  # 修改不成功,回滾transaction.savepoint_rollback(sid)return HttpResponse('被別人改了,回滾,秒殺失敗')else:transaction.savepoint_rollback(sid)return HttpResponse('庫存不足,秒殺失敗')

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/39190.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/39190.shtml
英文地址,請注明出處:http://en.pswp.cn/news/39190.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python實時監控鍵盤的輸入并打印出來

要實現Python實時監控鍵盤的輸入并打印出來,可以使用pynput模塊。 首先,需要安裝pynput模塊: pip install pynput 然后,可以編寫以下代碼來實現實時監控鍵盤輸入并打印出來的功能: from pynput import keyboard# 定…

【Unity每日一記】方位辨別—向量的叉乘點乘結合

👨?💻個人主頁:元宇宙-秩沅 👨?💻 hallo 歡迎 點贊👍 收藏? 留言📝 加關注?! 👨?💻 本文由 秩沅 原創 👨?💻 收錄于專欄:uni…

grafana 的 ws websocket 連接不上的解決方式

使用了多層的代理方式,一層沒有此問題 錯誤 WebSocket connection to ‘wss://ip地址/grafana01/api/live/ws’ failed: 日志報錯 msg“Request Completed” methodGET path/api/live/ws status403 解決方式 # allowed_origins is a comma-separated list of o…

Flutter:簡單搞一個內容高亮

內容高亮并不陌生,特別是在搜索內容頁面,可以說四處可見,就拿掘金這個應用而言,針對某一個關鍵字,我們搜索之后,與關鍵字相同的內容,則會高亮展示,如下圖所示: 如上的效果…

【Linux操作系統】舉例解釋Linux系統編程中文件io常用的函數

在Linux系統編程中,文件IO操作是非常常見和重要的操作之一。通過文件IO操作,我們可以打開、讀取、寫入和關閉文件,對文件進行定位、復制、刪除和重命名等操作。本篇博客將介紹一些常用的文件IO操作函數。 文章目錄 1. open()1.1 原型、參數及…

讀書筆記 |【項目思維與管理】? 順勢而動

讀書筆記 |【項目思維與管理】? 順勢而動 一、企業步入“終結者時代”二、過去成功的經驗也許是最可怕的三、做好非重復性的事四、適應客戶是出發點五、向知識型企業轉變六、速度是決勝條件 💖The Begin💖點點關注,收藏不迷路💖 …

docker私有倉庫harbor

一、安裝docker-compose yum install docker-compose -y 二、下載harbor安裝包 tar -xf harbor-online-installer-v2.1.0.tgz cp harbor.yml.tmpl harbor.yml 三、修改harbor配置 [rootharbor ~]# vim harbor.ymlhostname: "修改為本機ip" harboradminpassword:…

每天一道leetcode:1218. 最長定差子序列(動態規劃中等)

今日份題目: 給你一個整數數組 arr 和一個整數 difference,請你找出并返回 arr 中最長等差子序列的長度,該子序列中相鄰元素之間的差等于 difference 。 子序列 是指在不改變其余元素順序的情況下,通過刪除一些元素或不刪除任何…

iTOP-i.MX8M開發板添加USB網絡設備驅動

選中支持 USB 網絡設備驅動,如下圖所示: [*] Device Drivers→ *- Network device support → USB Network Adapters→ {*} Multi-purpose USB Networking Framework 將光標移動到 save 保存,如下圖所示: 保存到 arch/arm64/c…

樹形動態規劃——樹形dp

樹形動態規劃 樹形 d p dp dp算法是一種用于解決樹相關問題的動態規劃算法。它把樹的問題分解成了子問題,并通過子問題的求解來構建整個問題的解。 當我們面對一棵樹的問題時,我們可以使用樹形 d p dp dp來解決。這種算法的基本思想是通過定義一個用于…

C語言入門 Day_5 四則運算

目錄 前言 1.四則運算 2.其他運算 3.易錯點 4.思維導圖 前言 圖為世界上第一臺通用計算機ENIAC,于1946年2月14日在美國賓夕法尼亞大學誕生。發明人是美國人莫克利(JohnW.Mauchly)和艾克特(J.PresperEckert)。 計算機的最開始…

代碼隨想錄第四十四天

代碼隨想錄第四十四天 Leetcode 518. 零錢兌換 IILeetcode 377. 組合總和 Ⅳ Leetcode 518. 零錢兌換 II 題目鏈接: 零錢兌換 II 自己的思路:想不到,忘記這個遞推公式了!!!而且初始化也要值得注意! 正確思路:由于這個…

js數組學習(ES6+)

文章目錄 js(ES6)數組學習1.Array.prototype.forEach(fn)2.Array.prototype.map(fn)3.Array.prototype.filter(fn)4.Array.prototype.reduce(fn)5.Array.prototype.some(fn) every6.Array.prototype.find(fn)7.Array.prototype.includes(item) js(ES6)數組學習 1.Array.protot…

kube-prometheus 系列3 使用 blackbox-exporter 進行 icmp 和 http 監控

安裝kube-prometheus 后默認在monitoring namespace中有創建 blackbox-exporter deployment。但默認沒有icmp的module配置,無法執行ping探測。因為即使有icmp module,默認配置也是無法執行ping探測的(這篇文章要解決的就是這個問題&#xff0…

CentOS 7 下 Keepalived + Nginx 實現雙機高可用

CentOS 7 下 Keepalived Nginx 實現雙機高可用 文章目錄 CentOS 7 下 Keepalived Nginx 實現雙機高可用服務器準備服務信息服務架構 服務安裝nginxKeepalived 服務配置nginxKeepalived 啟動服務nginxkeepalived 服務驗證查看 VIP 狀態CURL 命令訪問瀏覽器訪問 高可用驗證停止…

146. LRU 緩存

題目描述 請你設計并實現一個滿足 LRU (最近最少使用) 緩存 約束的數據結構。 實現 LRUCache 類: LRUCache(int capacity) 以 正整數 作為容量 capacity 初始化 LRU 緩存int get(int key) 如果關鍵字 key 存在于緩存中,則返回關鍵字的值,否…

vue+springboot 前后端分離 上傳文件處理后再下載,并且傳遞參數

vue代碼 <template><div><input type"file" ref"fileInput" accept".json"/><el-button click"upload">上傳</el-button></div> </template><script> export default {name: "…

【第二階段】kotlin的lambda學習

匿名函數lambdm表達式 1.兩數相加 fun main() {//匿名函數lambda表達式//兩數相加 等價&#xff1a;val addResult:(Int,Int)->String{a,b->"兩數相加結果&#xff1a;${ab}"}val addResult{a:Int,b:Int->"兩數相加結果${ab}"}println(addResul…

Stable Diffusion WebUI 從零基礎到入門

本文主要介紹Stable Diffusion WebUI的實際操作方法&#xff0c;涵蓋prompt推導、lora模型、vae模型和controlNet應用等內容&#xff0c;并給出了可操作的文生圖、圖生圖實戰示例。適合對Stable Diffusion感興趣&#xff0c;但又對Stable Diffusion WebUI使用感到困惑的同學&am…

CSS變形與動畫(二):perspctive透視效果 與 preserve-3d 3d效果(奧運五環例子)

文章目錄 perspective 3d透視效果preserve-3d 3d嵌套效果例子 奧運五環 backface-visibility 背面效果 perspective 3d透視效果 perspective 指定了觀察者與 z0 平面的距離&#xff0c;使具有三維位置變換的元素產生透視效果。z>0 的三維元素比正常大&#xff0c;而 z<0 …