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

django實(shí)現(xiàn)悲觀鎖樂(lè)觀鎖的項(xiàng)目實(shí)踐

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

前期準(zhǔn)備

# 線上賣圖書(shū)
    -圖書(shū)表  圖書(shū)名字,圖書(shū)價(jià)格,庫(kù)存字段
    -訂單表: 訂單id,訂單名字
# 表準(zhǔn)備
    class Book(models.Model):
        name = models.CharField(max_length=32)
        price = models.IntegerField()  #
        count = models.SmallIntegerField(verbose_name='庫(kù)存')
    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ù)庫(kù)

1.原生mysql悲觀鎖

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

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

#1  使用悲觀鎖實(shí)現(xiàn)下單
@transaction.atomic  # 整個(gè)過(guò)程在一個(gè)事物中---》改兩個(gè)表:book表減庫(kù)存,訂單表生成記錄
def seckill(request):
    # 鎖住查詢到的book對(duì)象,直到事務(wù)結(jié)束
    sid = transaction.savepoint() # 保存點(diǎn)
    # 悲觀鎖: select_for_update()
    # 加鎖了--》行鎖還是表鎖? 分情況,都有可能
    #
    book = Book.objects.select_for_update().filter(pk=1).first()  # 加悲觀鎖,行鎖,鎖住當(dāng)前行
    if book.count > 0:
        print('庫(kù)存可以,下單')
        # 訂單表插入一條
        Order.objects.create(order_id=str(datetime.datetime.now()), order_name='測(cè)試訂單')
        # 庫(kù)存-1,扣減的時(shí)候,判斷庫(kù)存是不是上面查出來(lái)的庫(kù)存,如果不是,就回滾
        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('庫(kù)存不足,秒殺失敗')

3 樂(lè)觀鎖秒殺--》庫(kù)存還有,有的人就沒(méi)成功

# 2 樂(lè)觀鎖秒殺--普通版
@transaction.atomic
def seckill(request):
    # 鎖住查詢到的book對(duì)象,直到事務(wù)結(jié)束
    sid = transaction.savepoint()
    book = Book.objects.filter(pk=1).first()  # 沒(méi)加鎖
    count = book.count
    print('現(xiàn)在的庫(kù)存為:%s' % count)
    if book.count > 0:
        print('庫(kù)存可以,下單')
        Order.objects.create(order_id=str(datetime.datetime.now()), order_name='測(cè)試訂單-樂(lè)觀鎖')
        # 庫(kù)存-1,扣減的時(shí)候,判斷庫(kù)存是不是上面查出來(lái)的庫(kù)存,如果不是,就回滾
        # 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('庫(kù)存不足,秒殺失敗')

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

相關(guān)文章

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

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

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

    Python?設(shè)計(jì)模式中命令模式

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

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

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

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

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

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

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