総務・ロックORM

ロック

mysql:  select * from book where id=1 for update;

begin;  start transaction;
    select * from t1 where id=1 for update;
commit

rollback;


django orm
    models.Book.objects.select_for_update().filter(id=1)
entries = Entry.objects.select_for_update().filter(author=request.user)  #加互斥锁,由于mysql在查询时自动加的是共享锁,所以我们可以手动加上互斥锁。create、update、delete操作时,mysql自动加行级互斥锁

業務

1、グローバルオープン

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

  • トランザクションにおける各リクエストをラップされたWebアプリケーションでは、一般にトランザクション処理モードで使用されています。この機能は、使用することは非常に簡単です、あなただけのTrueに設定されたエントリーATOMIC_REQUESTSを設定する必要があります。

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

  • DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'hello',
            '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, #全局取消自动提交,慎用
        },
      'other':{
        'ENGINE': 'django.db.backends.mysql', 
                ......
      } #还可以配置其他数据库
    }

2、局所業務

  •  アトミック(セーブポイント= Trueのことを使用して=なし、 [ソース]は、パラメータ):あなたが他のデータベースを操作する際に使用して=「その他」、このトランザクションを有効にするには、、である、我々はデフォルトに加えて、上記のデータベース構成を見て、だけでなく、他のデフォルトはデフォルトです。セーブポイントの平均開いているトランザクションのセーブポイント

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

  • アトミック・ブロックを管理することもコード方法に埋め込まれてもよいです。外部コードブロックは例外をスローこの場合も内部コードブロック通常動作場合、それは、データベースへの変更を送信する方法はありません。

  • from django.db import transaction
    
    @transaction.atomic
    def viewfunc(request):
        # This code executes inside a transaction.
        do_stuff()

図3は、使用するコンテキストマネージャは、実際には、セットポイント事務を保存しました

  • 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.
            do_more_stuff()
    
        do_other_stuff()

おすすめ

転載: www.cnblogs.com/daviddd/p/12050915.html