最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前期準(zhǔn)備

# 線上賣圖書
    -圖書表  圖書名字,圖書價(jià)格,庫存字段
    -訂單表: 訂單id,訂單名字
# 表準(zhǔn)備
    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; # 開啟事務(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è)過程在一個(gè)事物中---》改兩個(gè)表:book表減庫存,訂單表生成記錄
def seckill(request):
    # 鎖住查詢到的book對象,直到事務(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('庫存可以,下單')
        # 訂單表插入一條
        Order.objects.create(order_id=str(datetime.datetime.now()), order_name='測試訂單')
        # 庫存-1,扣減的時(shí)候,判斷庫存是不是上面查出來的庫存,如果不是,就回滾
        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對象,直到事務(wù)結(jié)束
    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,扣減的時(shí)候,判斷庫存是不是上面查出來的庫存,如果不是,就回滾
        # 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('庫存不足,秒殺失敗')

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

相關(guān)文章

最新評論

来安县| 怀来县| 田东县| 微山县| 策勒县| 成安县| 石林| 郯城县| 孝感市| 石渠县| 金塔县| 汕尾市| 霍山县| 宣武区| 清新县| 武隆县| 雅江县| 大石桥市| 韩城市| 西城区| 和田县| 伊川县| 安岳县| 迁西县| 青海省| 邢台市| 仁寿县| 故城县| 广元市| 广东省| 扶风县| 福州市| 武宣县| 鲜城| 修水县| 扬中市| 颍上县| 裕民县| 历史| 大方县| 长垣县|