
рд╢рд╛рдпрдж рд╕рднреА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЕрдЬрдЧрд░ рдореЗрдВ рд╡реЗрдм рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП Django рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рд░реВрдкрд░реЗрдЦрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдФрд░ рднрд▓реЗ рд╣реА рд╡реЗрдм-рдкрд░рд┐рдпреЛрдЬрдирд╛ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдХреЛрдб рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛ, рдЕрдХреНрд╕рд░ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рд╡реЗ рдЗрд╕ рдврд╛рдВрдЪреЗ рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣рд┐рд╕реНрд╕реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдУрдЖрд░рдПрдоред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдПрдХ MySQL рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп Django ORM рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдЕрд░реНрдерд╛рддреН рд▓реЗрдирджреЗрди рдФрд░ рдЙрдирдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗ рдиреБрдХрд╕рд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рдЖрдкрдХреЛ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЕрдкреЗрдХреНрд╖рд┐рдд рдбреЗрдЯрд╛ рдХреЗ рдмрдЬрд╛рдп, рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛ рд╣реИ, рддреЛ рд╢рд╛рдпрдж рдпрд╣ рд▓реЗрдЦ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо InnoDB рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХрдорд╛рддреНрд░ рдЗрдВрдЬрди рд╣реИ рдЬреЛ MySQL рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИ рдФрд░ рд▓реЗрдирджреЗрди рдХрд╛ рдкреВрд░реНрдг рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ (BDB рдХреА рдЧрд┐рдирддреА рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ)ред
рдпрд╣ рдХрдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ:
1. Django рдореЗрдВ,
MySQLdb рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ MySQL рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣, рдмрджрд▓реЗ рдореЗрдВ,
рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рддрд╛ рд╣реИ :
AUTOCOMMIT=0
рдпрд╣реА рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдбреЗрдЯрд╛ рд╕рдВрд╢реЛрдзрди рдСрдкрд░реЗрд╢рди рдХреЛ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдпрд╛ рд░реЛрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ COMMIT / рд░реЛрд▓рдмреИрдХ рдкреВрд░рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдЖрдк MySQL рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП PHP рдПрдХреНрд╕рдЯреЗрдВрд╢рди (рдкреАрдбреАрдУ, рдореИрд╕рдХрд▓реА) рдпрд╛ рд░реВрдмреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╢рд╛рдпрдж рдереЛрдбрд╝рд╛ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рд╣реЛрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╕рдордп рд▓рдЧрднрдЧ рд╕рднреА рдбреЗрдЯрд╛рдмреЗрд╕ рдПрдХреНрд╕реЗрд╕ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдореЗрдВ,
AUTOCOMMIT рдорд╛рди рдирд╣реАрдВ рдмрджрд▓рддрд╛ (рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ MySQL рдореЗрдВ рдпрд╣
AUTOCOMMIT = 1 рдкрд░ рд╕реЗрдЯ рд╣реИ) )ред
2. MySQL
REPEATABLE-READ рд▓реЗрдирджреЗрди рдЕрд▓рдЧрд╛рд╡ рд╕реНрддрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, PosgreSQL рдпрд╛ Oracle, рдЬрд┐рд╕рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд▓реЗрдирджреЗрди рдЕрд▓рдЧрд╛рд╡ рд╕реНрддрд░
READ-COMMITTED рд╣реИ ред
рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ? рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
CREATE TABLE IF NOT EXISTS `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `value` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `test` VALUES (NULL, 'a');
Repeatable-рдкрдврд╝реЗрдВ
рдкрд╣рд▓рд╛ рд▓реЗрдирджреЗрди: | рджреВрд╕рд░рд╛ рд▓реЗрдирджреЗрди: |
---|
рд╕реЗрдЯ AUTOCOMMIT = 0; | рд╕реЗрдЯ AUTOCOMMIT = 0; |
рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ * рд╕реЗ `рдкрд░реАрдХреНрд╖рдг`;
+ ---- + ------- +
| рдЖрдИрдбреА | рдореВрд▓реНрдп |
+ ---- + ------- +
| 1 | рдП |
+ ---- + ------- +
| |
| INSERT INTO `рдкрд░реАрдХреНрд╖рдг` рд╡рд╛рд▓реНрд╡ (NULL, 'b'); рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ * рд╕реЗ `рдкрд░реАрдХреНрд╖рдг`;
+ ---- + ------- +
| рдЖрдИрдбреА | рдореВрд▓реНрдп |
+ ---- + ------- +
| 1 | рдП |
| 2 | рдмреА |
+ ---- + ------- + COMMIT; |
INSERT INTO `test` VALUES (NULL, 'c'); рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ * рд╕реЗ `рдкрд░реАрдХреНрд╖рдг`;
+ ---- + ------- +
| рдЖрдИрдбреА | рдореВрд▓реНрдп |
+ ---- + ------- +
| 1 | рдП |
| 3 | рд╕реА |
+ ---- + ------- + COMMIT; | |
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЙрджрд╛рд╣рд░рдг рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкрд╣рд▓реЗ рдбреЗрдЯрд╛ рд░реАрдбрд┐рдВрдЧ рдХреЗ рдмрд╛рдж рдкрд╣рд▓реЗ рд▓реЗрди-рджреЗрди рдореЗрдВ, рдмрд╛рдж рдХреЗ рд╕рднреА рд░реАрдбрд┐рдВрдЧ рдмрд┐рд▓реНрдХреБрд▓ рдЙрд╕реА рдкрд░рд┐рдгрд╛рдо рдкрд░ рд▓реМрдЯреЗрдВрдЧреЗ рдЬрдм рддрдХ рдХрд┐
COMMIT рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдЕрдиреНрдп рд▓реЗрдирджреЗрди рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред
рдкрдврд╝реЗрдВ-рдХрдЯрд┐рдмрджреНрдз
рдкрд╣рд▓рд╛ рд▓реЗрдирджреЗрди: | рджреВрд╕рд░рд╛ рд▓реЗрдирджреЗрди: |
---|
рд╕рддреНрд░ рд╕реЗрдЯ рдХрд░реЗрдВ tx_isolation = 'READ-COMMITTED'; рд╕реЗрдЯ AUTOCOMMIT = 0; | рд╕рддреНрд░ рд╕реЗрдЯ рдХрд░реЗрдВ tx_isolation = 'READ-COMMITTED'; рд╕реЗрдЯ AUTOCOMMIT = 0; |
рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ * рд╕реЗ `рдкрд░реАрдХреНрд╖рдг`;
+ ---- + ------- +
| рдЖрдИрдбреА | рдореВрд▓реНрдп |
+ ---- + ------- +
| 1 | рдП |
+ ---- + ------- +
| |
| INSERT INTO `рдкрд░реАрдХреНрд╖рдг` рд╡рд╛рд▓реНрд╡ (NULL, 'b'); |
рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ * рд╕реЗ `рдкрд░реАрдХреНрд╖рдг`;
+ ---- + ------- +
| рдЖрдИрдбреА | рдореВрд▓реНрдп |
+ ---- + ------- +
| 1 | рдП |
+ ---- + ------- + | |
| рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ * рд╕реЗ `рдкрд░реАрдХреНрд╖рдг`;
+ ---- + ------- +
| рдЖрдИрдбреА | рдореВрд▓реНрдп |
+ ---- + ------- +
| 1 | рдП |
| 2 | рдмреА |
+ ---- + ------- + COMMIT; |
INSERT INTO `test` VALUES (NULL, 'c'); рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ * рд╕реЗ `рдкрд░реАрдХреНрд╖рдг`;
+ ---- + ------- +
| рдЖрдИрдбреА | рдореВрд▓реНрдп |
+ ---- + ------- +
| 1 | рдП |
| 2 | рдмреА |
| 3 | рд╕реА |
+ ---- + ------- + COMMIT; | |
READ-COMMITTED рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, SELECT рд╣рдореЗрд╢рд╛ рдбреЗрдЯрд╛ рдХреЗ рдЕрдВрддрд┐рдо рдкреНрд░рддрд┐рдмрджреНрдз рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред
Django рдХреЗ рд╡рд┐рд╖рдп рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯрдирд╛ - Django ORM рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдкрдХрдбрд╝ рдпрд╣ рд╣реИ рдХрд┐ READ-COMMITTED рдХреЛ рдХреЗрд╡рд▓ рд▓реЗрди-рджреЗрди рдЕрд▓рдЧрд╛рд╡ рд╕реНрддрд░ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдо Django рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН,
QuerySet рд╡рд░реНрдЧ рдореЗрдВ
get_or_create () рдкрджреНрдзрддрд┐ рдХрд╛
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди :
def get_or_create(self, **kwargs): """ Looks up an object with the given kwargs, creating one if necessary. Returns a tuple of (object, created), where created is a boolean specifying whether an object was created. """ assert kwargs, \ 'get_or_create() must be passed at least one keyword argument' defaults = kwargs.pop('defaults', {}) lookup = kwargs.copy() for f in self.model._meta.fields: if f.attname in lookup: lookup[f.name] = lookup.pop(f.attname) try: self._for_write = True return self.get(**lookup), False except self.model.DoesNotExist: try: params = dict([(k, v) for k, v in kwargs.items() if '__' not in k]) params.update(defaults) obj = self.model(**params) sid = transaction.savepoint(using=self.db) obj.save(force_insert=True, using=self.db) transaction.savepoint_commit(sid, using=self.db) return obj, True except IntegrityError, e: transaction.savepoint_rollback(sid, using=self.db) exc_info = sys.exc_info() try: return self.get(**lookup), False except self.model.DoesNotExist:
рдлрд┐рд░ рд╡рд╕реНрддреБ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рджреВрд╕рд░рд╛ рдкреНрд░рдпрд╛рд╕:
return self.get(**lookup), False
рд╣рдореЗрд╢рд╛ рд╡рд┐рдлрд▓ рд░рд╣реЗрдЧрд╛ред
рдореИрдВ рд╕рдордЭрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдБрдЧрд╛ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рджреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдБ рдПрдХ рд╕рд╛рде рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдореЙрдбрд▓ рдХреЗ
get_or_create () рд╡рд┐рдзрд┐ рдХреЛ
рдмреБрд▓рд╛рддреА рд╣реИрдВ ред рдкрд╣рд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдбреЗрдЯрд╛ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреА рд╣реИ - рдХреЛрдИ рдбреЗрдЯрд╛ рдирд╣реАрдВ рд╣реИ, рдПрдХ
DoNotExist рдЕрдкрд╡рд╛рдж
рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рджреВрд╕рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреА рд╣реИ рдФрд░ рдЗрд╕реА рддрд░рд╣ рдПрдХ
DoNotExist рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЪреВрдВрдХрд┐ рдХрдиреЗрдХреНрд╢рди AUTOCOMMIT = 0 рдФрд░ рд▓реЗрди-рджреЗрди рдЕрд▓рдЧрд╛рд╡ рд╕реНрддрд░ REPEATABLE-READ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рджреЛрдиреЛрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рд░реАрдб рдбреЗрдЯрд╛ рдХреЛ рдлреНрд░реАрдЬ рдХрд░рддреА рд╣реИрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдкрд╣рд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдПрдХ рд░рд┐рдХреЙрд░реНрдб рдмрдирд╛рддреА рд╣реИ рдФрд░ рдмрдирд╛рдП рдЧрдП рд░рд┐рдХреЙрд░реНрдб рдХреА рд╡рд╕реНрддреБ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреА рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рджреВрд╕рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдХреА рдмрд╛рдзрд╛ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░реЗрдЧреАред рдордЬреЗрджрд╛рд░ рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╡рд╣ рдкрд╣рд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдмрдирд╛рдИ рдЧрдИ рд╡рд╕реНрддреБ рдХреЛ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реИ, рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдЬрдм рдбреЗрдЯрд╛ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ "рдЬрдореЗ рд╣реБрдП" рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред
рдмреЗрд╢рдХ, рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИ, рд▓реЗрдХрд┐рди рдХрдИ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рд╛рде, рдпрд╣ рдХреЛрдб рдЕрд╕реНрдерд┐рд░ рд╣реЛрдЧрд╛, рд╕рдордп-рд╕рдордп
рдкрд░ рдПрдХ DoNotExist рдЕрдкрд╡рд╛рдж рдХреЛ
рдлреЗрдВрдХ рджреЗрдЧрд╛ ред
рдЗрд╕рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯреЗрдВ?
1. рдпрджрд┐ рдЖрдк
get_or_create () рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рддрд░реАрдХрд╛ рд▓рд┐рдЦреЗрдВ рдЬреЛ рдбреЗрдЯрд╛ рдкрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдордЬрдмреВрд░ COMMIT рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ:
@transaction.commit_manually() def custom_get_or_create(...): try: obj = SomeModel.objects.create(...) except IntegrityError: transaction.commit() obj = SomeModel.objects.get(...) return obj
2. MySQL рд╕реЗрдЯрд┐рдВрдЧреНрд╕ (/etc/mysql/my.cnf) рдореЗрдВ, READ-COMMITTED рд▓реЗрдирджреЗрди рдЖрдЗрд╕реЛрд▓реЗрд╢рди рд╕реНрддрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
transaction-isolation = READ-COMMITTED
3. Django> = 1.2 рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдбреЗрдЯрд╛рдмреЗрд╕ рдХрдиреЗрдХреНрд╢рди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗрдЯрд┐рдВрдЧ рдХреЛрдб рдореЗрдВ рдирд┐рдореНрди рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
DATABASE_OPTIONS = { "init_command": "SET storage_engine=INNODB, SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED", }
рдпрд╣ рдмрдЧ рд▓рдВрдмреЗ рд╕рдордп рддрдХ Django
рдмрдЧ рдЯреНрд░реИрдХрд░ рдкрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЕрдм рддрдХ рдЯрд┐рдХрдЯ рдмрдВрдж рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ рдФрд░ рд╕рдорд╕реНрдпрд╛ рдЕрднреА рднреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИред
рдпрд╛ рдпрд╣рд╛рдБ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рд╣реИ - рдорд╛рди рд▓реЗрдВ рдХрд┐ Django ORM рд╡реЗрдм рд╕рд░реНрд╡рд░ рд╕реЗ рдЕрд▓рдЧ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ рдбреЗрдореЙрди рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛ рд▓рдЧрд╛рддрд╛рд░ рдореЗрдореЛрд░реА рдореЗрдВ рд▓рдЯрдХрд╛ рд░рд╣рддрд╛ рд╣реИ рдФрд░ рд╕рдордп-рд╕рдордп рдкрд░ MySQL рдЯреЗрдмрд▓ рд╕реЗ рдирдП рдбреЗрдЯрд╛ рдХреЛ рдкрдврд╝рддрд╛ рд╣реИред рдпрд╣ рдкреНрд░рдпреЛрдЧ Django рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рд╢реЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
python manage.py shell >>> from test_module.models import * >>> len(SomeModel.objects.all()) 10
рдЕрдЧрд▓рд╛, рджреВрд╕рд░реЗ рдЯрд░реНрдорд┐рдирд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдХреБрдЫ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рдЬреЛрдбрд╝реЗрдВ:
>>> SomeModel(name='test1').save() >>> SomeModel(name='test2').save() >>> len(SomeModel.objects.all()) 12
рдФрд░ рдпрджреНрдпрдкрд┐ рджреВрд╕рд░реЗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╕реНрдкрд╖реНрдЯ рд╣реИрдВ, рдкрд╣рд▓реЗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рдпреЗ рдирдИ рдЬреЛрдбрд╝реА рдЧрдИ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рдЕрднреА рднреА рдЕрдиреБрдкрд▓рдмреНрдз рд░рд╣реЗрдВрдЧреА, рдЬреИрд╕рд╛ рдХрд┐ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд▓реЗрди-рджреЗрди рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ, рдФрд░ рдбреЗрдЯрд╛ рдХреЗ рдкрд╣рд▓реЗ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдмрд╛рдж рдХреЗ рд╕рднреА рд░реАрдбрд┐рдВрдЧ рдЙрд╕реА рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдВрдЧреЗ рдЬрдм рддрдХ рдХрд┐ COMMIT рдХреЛ рдЬрдмрд░рди рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕рд╕реЗ рдХреНрдпрд╛ рд▓реЗрдирд╛-рджреЗрдирд╛? Mysql рд╕реЗрдЯрд┐рдВрдЧреНрд╕ (my.cnf) рдореЗрдВ рдпрд╛ Django рдореЗрдВ settings.py рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрдиреЗрдХреНрд╢рди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рд▓реЗрдирджреЗрди рдЕрд▓рдЧрд╛рд╡ рд╕реНрддрд░ рдмрджрд▓реЗрдВред рдЦреИрд░, рдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж рдбреЗрдЯрд╛ рдХреЛ рдордЬрдмреВрд░ рдХрд░реЗрдВ:
>>> from django.db import connection, transaction >>> len(Param_Type.objects.all()) 10 >>> transaction.commit_unless_managed() >>> len(Param_Type.objects.all()) 12
рдпрд╣ рд╕рдм рдХреНрдпреЛрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ? рд╢рд╛рдпрдж рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ Django рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ PostgreSQL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдХрд┐ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╣реИ, READ-COMMITTED рдХрд╛ рдЙрдкрдпреЛрдЧ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдХрд░рддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, MySQL InnoDB рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ Django ORM рдХрд╛ рдпрд╣ рдХрд╛рдлреА рдорд╛рдирдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрдЧ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдореЗрдВ рдХрд╛рдлреА рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдЬрд╣рд╛рдВ рд╡рд░реНрдгрд┐рдд рд╕рдорд╕реНрдпрд╛ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рддреА рд╣реИ (рд╡рд┐рднрд┐рдиреНрди рдмреНрд▓реЙрдЧреЛрдВ рдореЗрдВ рдФрд░ рд╕реНрдЯреИрдХрдУрд╡рд░рдлреНрд▓реЛ рдкрд░), рдпрд╣ рджреГрдврд╝рддрд╛ рд╕реЗ рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ READ-COMMITTED рдХрд╛ рдЙрдкрдпреЛрдЧ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд▓реЗрдирджреЗрди рдЕрд▓рдЧрд╛рд╡ рд╕реНрддрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдпрд╣ рддрд░реНрдХ рджреЗрддреЗ рд╣реБрдП рдХрд┐ READ-COMMITTED REPEATABLE-READ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ
"рдЕрдзрд┐рдХ рдЙрддреНрдкрд╛рджрдХ" рд╣реИред