Django(ORM的鎖和事務)


一.鎖

mysql中的加鎖,不會防止其他用戶的查詢,會防止其他用戶的增刪改操作。

entries = Entry.objects.select_for_update().filter(author=request.user) #所有匹配的行將被鎖定,直到事務結束
select_for_update(nowait=False, skip_locked=False) #注意必須用在事務里面
目前,postgresql,oracle和mysql數據庫后端支持select_for_update()。 但是,MySQL不支持nowait和skip_locked參數。

二.事務

1.全局開啟

當有請求過來時,Django會在調用視圖方法前開啟一個事務。如果請求正確處理並正確返回了結果,Django就會提交該事務。否則,Django會回滾該事務。

這個功能使用起來非常簡單,你只需要將它的配置項ATOMIC_REQUESTS設置為True。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mxshop',
        'HOST': '127.0.0.1',
        'PORT': '3306',
        'USER': 'root',
        'PASSWORD': '123',
        'OPTIONS': {
            "init_command": "SET default_storage_engine='INNODB'",
       #'init_command': "SET sql_mode='STRICT_TRANS_TABLES'", #配置開啟嚴格sql模式


        }
        "ATOMIC_REQUESTS": True, #全局開啟事務,綁定的是http請求響應整個過程
        "AUTOCOMMIT":False, #全局取消自動提交,慎用
    },
}

上面這種方式是統一個http請求對應的所有sql都放在一個事務中執行(要么所有都成功,要么所有都失敗)。是全局性的配置, 如果要對某個http請求放水(然后自定義事務),可以用non_atomic_requests修飾器,那么他就不受事務的管控了

from django.db import transaction

@transaction.non_atomic_requests
def my_view(request):
    do_stuff()

@transaction.non_atomic_requests(using='other')
def my_other_view(request):
    do_stuff_on_the_other_database()
使用non_atomic_requests修飾,不建議使用

2.局部使用事務

原子性是數據庫事務的一個屬性。使用atomic,我們就可以創建一個具備原子性的代碼塊。一旦代碼塊正常運行完畢,所有的修改會被提交到數據庫。反之,如果有異常,更改會被回滾。

用法1:給函數做裝飾器來使用

from django.db import transaction

@transaction.atomic
def viewfunc(request):
    # This code executes inside a transaction.
    do_stuff()

用法2:作為上下文管理器來使用

from django.db import transaction
def viewfunc(request):
    # This code executes in autocommit mode (Django's default).
    do_stuff()

    with transaction.atomic():   #開啟事務
        # This code executes inside a transaction.
     entries = Entry.objects.select_for_update().filter(author=request.user) #會鎖住所有匹配的行,直到事務結束
        entries.update(xxx) #當有兩個用戶同時來訪問時,可能會查詢到相同的結果(相當於2個線程),但是后進來的數據不會執行更刪改操作,直到第一個事務結束
 do_other_stuff()

 

transaction只對數據庫層的操作進行事務管理,不能理解為python操作的事務管理

具體參考:https://www.cnblogs.com/clschao/articles/10463267.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM