sql >> Database >  >> RDS >> Mysql

Django DB-transacties en impasses

Merk op dat je misschien de duidelijkere with . wilt gebruiken -stijl syntaxis. Het volgende zou identiek moeten zijn aan uw bovenstaande code, maar meer pytonisch.

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)

of met een decorateur

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)

Dat lost je impasseprobleem echter niet op.

Mogelijk hebt u succes met het verlagen van uw transactie-isolatieniveau. Dit staat standaard op mysql op REPEATABLE READ wat te streng is voor de meeste toepassingen. (oracle staat standaard op READ COMMITTED ')

U kunt dit bereiken door dit toe te voegen aan uw 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
      }
  }



  1. Oracle sequentie caching

  2. Dubbelzinnige kolomquery

  3. Alleen PostgreSQL in het geheugen uitvoeren

  4. Toegang geweigerd voor gebruiker root - mysql op MAC OS