ORMのロックおよびトランザクション

A.ロック

ロックでのMySQLは、我々が運転に追加および削除の他のユーザーを防ぐことができます、他のユーザーのクエリを防ぐことはできません。

エントリー= Entry.objects.select_for_update()。フィルター(著者=からrequest.user)# すべての行に一致するトランザクションが終了するまでロックされている
select_for_update(NOWAIT = Falseを、skip_locked = False)が#の注意がトランザクションで使用されなければならない
現状では、PostgreSQLの、 OracleとMySQLデータベースバックエンドサポートselect_for_update()。しかし、MySQLはNOWAITをサポートし、パラメータをskip_lockedしません。

II。トランザクション

グローバルを有効にする1

リクエストが来たときに、Djangoはビューのメソッドを呼び出す前に、トランザクションを開きます。リクエストが適切に準備され、正しく結果を返す場合、Djangoはトランザクションをコミットします。そうでなければ、Djangoはトランザクションをロールバックします。

この機能は、使用することは非常に簡単です、あなただけのエントリを設定する必要がありますATOMIC_REQUESTS Trueに設定します。

= {DATABASES 
    'デフォルト':{ 
        'ENGINE': 'django.db.backends.mysql'、
        'NAME': 'mxshop'、
        'ホスト': '127.0.0.1'、
        'PORT': '3306'、
        「USER ':'ルート' 
        'PASSWORD ':' 123'、
        ' OPTIONS ':{ 
            "init_command": "SETのdefault_storage_engine =' INNODB '"、
       #' init_command ':「SET sql_modeの=' STRICT_TRANS_TABLES ' "、#の構成は、厳密に開きSQLモード
 
 
        } 
        「ATOMIC_REQUESTS」:#グローバル情勢を有効に真は、プロセス全体を通してhttpリクエストの応答にバインドされている
        「自動コミット」:偽、#グローバルキャンセル自動送信、注意
    } 
}

  すべてのSQLのhttp統一要求は、対応するトランザクションの実行(いずれかのすべての成功、または他のすべてが失敗した)に配置されている上に、このアプローチがあります。あなたは、あなたがして、彼は業務を制御することはできません、non_atomic_requestsデコレータを使用することができ、HTTP要求のために水をオンにする(その後、トランザクションをカスタマイズ)したい場合は、グローバルコンフィギュレーションは、あります

django.db 輸入取引

@ transaction.non_atomic_requests 
デフmy_view(リクエスト):
    do_stuff()

transaction.non_atomic_requests(使用@ = ' ' デフmy_other_view(リクエスト):
    do_stuff_on_the_other_database()
使用non_atomic_requests変更は推奨されません

2.局所業務

原子性は、プロパティデータベースのトランザクションです。私たちは、原子含むコードのブロックを作成することができ、アトミック使用します。ブロック通常動作が完了すると、すべての変更がデータベースにコミットされています。例外がある場合は逆に、変更はロールバックされます。

シンタックス1:機能使用にデコレータを行うには

django.db輸入取引から
 
@ transaction.atomic 
デフviewfunc(リクエスト):
    トランザクション内#このコードが実行されます。
    do_stuff()

  

2使用方法:コンテキストマネージャとして使用

以下からの輸入取引django.db 
DEF viewfunc(要求): 自動コミット中#このコードを実行MODE(Djangoのデフォルト)
    do_stuff() 

    )(transaction.atomic と:#開いているトランザクション
        。#このコードを実行インサイドAトランザクションは
     それがEntry.objectsを=エントリ.select_for_update()。フィルター(著者=からrequest.user)#は、 すべての行をロックするトランザクションが終了するまで一致していることを
        アクセスする2人の同時ユーザーがいるentries.update(XXX)#は、クエリが(同じ結果になることがあり二つのスレッドの当量)が、着信データの後の最初のトランザクションが終了するまでの動作をプルーニング以上実行しません
 do_other_stuff()

 

唯一のトランザクション管理、トランザクション管理のためのデータベーストランザクション層の動作は、Pythonの操作として理解することができません

 

 

 

 

 

おすすめ

転載: www.cnblogs.com/ly0123/p/11938516.html