Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Django DB-Transaktionen und Deadlocks

Beachten Sie, dass Sie vielleicht das deutlichere with verwenden möchten -Stil-Syntax. Das Folgende sollte mit Ihrem obigen Code identisch sein, aber pytonischer.

from django.db import transaction
from __future__ import with_statement

def process(self, db, data):

    with transaction.commit_on_success(using=db):
        # do things with my_objects...
        for obj in my_objects:
            obj.save(using=db)

oder mit einem Dekorateur

from django.db import transaction

@transaction.commit_on_success(using=db)
def process(self, db, data):    

    # do things with my_objects...
    for obj in my_objects:
        obj.save(using=db)

Das löst jedoch nicht Ihr Deadlock-Problem..

Möglicherweise haben Sie Erfolg, wenn Sie Ihre Transaktionsisolationsstufe verringern. Dies ist bei mysql standardmäßig REPEATABLE READ was für die meisten Anwendungen zu streng ist. (Oracle verwendet standardmäßig READ COMMITTED ')

Sie können dies erreichen, indem Sie dies zu Ihrer settings.py hinzufügen

MYSQL_DATABASE_OPTIONS = {'init_command': 'SET storage_engine=INNODB; SET 
                 SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;'}

DATABASES = {
  'default': {  # repeat for each db
       'ENGINE':  ... etc
       ...
       ...
       'OPTIONS': MYSQL_DATABASE_OPTIONS
      }
  }