欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

django實現(xiàn)悲觀鎖樂觀鎖的項目實踐

 更新時間:2023年08月16日 08:55:00   作者:淘淘桃  
在Django中,我們可以通過實現(xiàn)悲觀鎖和樂觀鎖來保證數(shù)據(jù)的安全性,本文就來介紹一下django實現(xiàn)悲觀鎖樂觀鎖的項目實踐,感興趣的可以了解一下

前期準備

# 線上賣圖書
    -圖書表  圖書名字,圖書價格,庫存字段
    -訂單表: 訂單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',
    }
}
# 創(chuàng)建lqz數(shù)據(jù)庫

1.原生mysql悲觀鎖

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

2.orm實現(xiàn)上述(悲觀鎖) 

#1  使用悲觀鎖實現(xiàn)下單
@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-1
        book.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.count
    print('現(xiàn)在的庫存為:%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('庫存不足,秒殺失敗')

到此這篇關于django實現(xiàn)悲觀鎖樂觀鎖的項目實踐的文章就介紹到這了,更多相關django 悲觀鎖樂觀鎖內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Python標準庫pickle的簡單使用

    Python標準庫pickle的簡單使用

    本文主要介紹了Python標準庫pickle的簡單使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-05-05
  • python中文亂碼的解決方法

    python中文亂碼的解決方法

    亂碼在哪種語言里都會出現(xiàn),今天給你二個解決python中文亂碼的方法。
    2013-11-11
  • django開發(fā)教程之利用緩存文件進行頁面緩存的方法

    django開發(fā)教程之利用緩存文件進行頁面緩存的方法

    緩存相信對各位程序員們來說都不陌生,下面這篇文章主要給大家介紹了關于django開發(fā)教程之利用緩存文件進行頁面緩存的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友們可以參考借鑒,下面隨著小編來一起學習學習吧。
    2017-11-11
  • Python Celery異步任務隊列使用方法解析

    Python Celery異步任務隊列使用方法解析

    這篇文章主要介紹了Python Celery異步任務隊列使用方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • Python面向對象編程(一)

    Python面向對象編程(一)

    本文詳細講解了Python的面向對象編程,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • python編寫softmax函數(shù)、交叉熵函數(shù)實例

    python編寫softmax函數(shù)、交叉熵函數(shù)實例

    這篇文章主要介紹了python編寫softmax函數(shù)、交叉熵函數(shù)實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • Python?設計模式中命令模式

    Python?設計模式中命令模式

    這篇文章主要介紹了Python?設計模式中的命令模式,命令模式的目的是解耦調用操作的對象和提供實現(xiàn)的對象,下文介紹具有一定參考價值,需要的小伙伴可以參考一下
    2022-02-02
  • Python中實現(xiàn)定時任務常見的幾種方式

    Python中實現(xiàn)定時任務常見的幾種方式

    在Python中,實現(xiàn)定時任務是一個常見的需求,無論是在自動化腳本、數(shù)據(jù)處理、系統(tǒng)監(jiān)控還是其他許多應用場景中,Python提供了多種方法來實現(xiàn)定時任務,包括使用標準庫、第三方庫以及系統(tǒng)級別的工具,本文將詳細介紹幾種常見的Python定時任務實現(xiàn)方式
    2024-08-08
  • 詳解如何使用Python隱藏圖像中的數(shù)據(jù)

    詳解如何使用Python隱藏圖像中的數(shù)據(jù)

    隱寫術是在任何文件中隱藏秘密數(shù)據(jù)的藝術。隱寫術的主要目的是隱藏任何文件中的預期信息,而不實際改變文件的外觀,即文件外觀看起來和以前一樣。本文將利用Python實現(xiàn)隱藏圖像中的數(shù)據(jù),需要的可以參考一下
    2022-02-02
  • mvc框架打造筆記之wsgi協(xié)議的優(yōu)缺點以及接口實現(xiàn)

    mvc框架打造筆記之wsgi協(xié)議的優(yōu)缺點以及接口實現(xiàn)

    這篇文章主要給大家介紹了關于mvc框架打造筆記之wsgi協(xié)議的優(yōu)缺點以及接口實現(xiàn)的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-08-08

最新評論