sql >> Base de Datos >  >> RDS >> Mysql

Transacciones y puntos muertos de Django DB

Tenga en cuenta que es posible que desee utilizar el with más claro sintaxis de estilo. Lo siguiente debería ser idéntico a su código anterior, pero más pitónico.

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)

o con un decorador

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)

Sin embargo, eso no resuelve su problema de interbloqueo...

Es posible que tenga éxito al reducir su nivel de aislamiento de transacciones. Esto por defecto en mysql a REPEATABLE READ que es demasiado estricto para la mayoría de los usos. (Oracle por defecto es READ COMMITTED ')

Puede lograr esto agregando esto a su settings.py

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
      }
  }