Mysql
 sql >> Base de données >  >> RDS >> Mysql

Transactions Django DB et blocages

Notez que vous voudrez peut-être utiliser le with plus clair -style syntaxe. Ce qui suit devrait être identique à votre code ci-dessus, mais plus pytonique.

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)

ou avec un décorateur

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)

Cela ne résout cependant pas votre problème de blocage..

Vous pourriez réussir à réduire votre niveau d'isolement des transactions. Ceci par défaut sur mysql à REPEATABLE READ qui est trop strict pour la plupart des usages. (Oracle par défaut est READ COMMITTED ')

Vous pouvez y parvenir en ajoutant ceci à votre 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
      }
  }