sql >> Databasteknik >  >> RDS >> Mysql

Django DB-transaktioner och dödlägen

Observera att du kanske vill använda den tydligare with -stil syntax. Följande bör vara identisk med din kod ovan, men mer pytoniskt.

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)

eller med en dekoratör

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)

Det löser dock inte ditt dödlägesproblem...

Du kan ha framgång med att sänka din transaktionsisoleringsnivå. Detta är standard på mysql till REPEATABLE READ vilket är för strikt för de flesta användningsområden. (oracle har som standard READ COMMITTED ')

Du kan uppnå detta genom att lägga till detta i din 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. Varchar till nummerkonvertering för sortering

  2. Python Connector för Django 1.9 och Python 3.5?

  3. Använder setDate i PreparedStatement

  4. Att lagra bildfiler i Mongo-databasen, är det en bra idé?