Maison > développement back-end > Tutoriel Python > Introduction à l'analyse du code source des transactions Python Django

Introduction à l'analyse du code source des transactions Python Django

高洛峰
Libérer: 2017-03-19 09:18:15
original
1723 Les gens l'ont consulté

Cet article présente principalement les informations pertinentes sur l'analyse du code source de la transaction python django Les amis dans le besoin peuvent se référer à

transaction python Django <.>

Il y a beaucoup d'informations sur Django 1.6 sur Internet, mais je ne trouve aucune information sur la 1.8. J'ai déployé beaucoup d'efforts lorsque j'ai voulu l'utiliser, mais cela n'a pas été le cas. Travail.Maintenant, peu de gens en ont pris note. Version Detour : Django 1.8 Document officiel de la transaction Il existe de nombreuses méthodes dans le document chinois de la transaction. Je n'entrerai pas dans les détails une par une. n'analysera que le code source de la méthode atomique. D'après le document officiel transaction.atomic, il existe deux utilisations : le décorateur et la gestion du contexte

# atomic() 方法 
# from django.db import transaction
###################
# atomic()
###################
def atomic(using=None, savepoint=True): # 装饰器和上下文管理器必须.()调用方法,因为真正的处理是该方法返回的实例,不是该方法本身
 if callable(using):
  return Atomic(DEFAULT_DB_ALIAS, savepoint)(using)
 # Decorator: @atomic(...) or context manager: with atomic(...): ...
 else:
  return Atomic(using, savepoint)
##########################################
# Atomic类 省略了非核心内容
############################################
class Atomic(ContextDecorator):
 def init(self, using, savepoint):
 self.using = using
 self.savepoint = savepoint
 def enter(self):
 connection = get_connection(self.using)
 sid = connection.savepoint()   # 进入with创建一个保存点
 # .............do
 def exit(self, exc_type, exc_value, traceback):
 if connection.in_atomic_block:
 # do.............
 if sid is not None:
  try:
   connection.savepoint_commit(sid)  # 提交事务
  except DatabaseError:
   try:
    connection.savepoint_rollback(sid) # 捕获数据库异常回滚
    connection.savepoint_commit(sid)
   except Error:
    connection.needs_rollback = True
   raise
 ## 还有一段代码是exec_type收到其他程序异常时候 全局回滚,此处省略
 # do.................
###############################
# ContextDecorator
#################################
class ContextDecorator(object):
 def call(self, func):
  def inner(*args, **kwargs):
   with self:    # 把函数放进self的with上下文管理器,效果with相同,只是控制细粒度不同
    return func(*args, **kwargs)
  return inner
Copier après la connexion
python MySQLdb

Retour en arrière à granularité fine :
class Tran():
 def init(self, conn=None, close=True):
  if conn is None:     # 创建数据库链接
   print 'init'
   self.conn = conn_tbkt()
   self.cur = self.conn.cursor()
   self.sql = []
 def enter(self):       # 上下文管理器返回 sql语句列表 with Tran('tbkt_pxb') as sqls:
  print 'enter'
  return self.sql  # sql.append('select 1')
 def exit(self, exc_type, exc_val, exc_tb):
  print 'exit'
  try:
   print self.sql        # 执行sql
   for s in self.sql:
    self.cur.execute(s)
   self.conn.commit()
  except:            # 可以捕获所有异常(django事务如果中间出现程序异常终止无法回滚)
   try:     # 回滚本身也是sql执行,也有可能失败
    import traceback
    traceback.print_exc()
    print 'rollback'
    self.conn.rollback()
   except:
    print u'回滚失败'
  finally:
   self.cur.close()
   self.conn.close()
Copier après la connexion

Remarque : s'il existe plusieurs bases de données avec des itinéraires, vous devez spécifier Utiliser de manière cohérente avec le retour de routage :
# 在事务块中@atomic() 或者 with atomic():
sid = transaction.savepoint('tbkt_pxb')
try:
 # do ..........
except:
 transaction.savepoint_rollback(sid, 'tbkt_pxb')
Copier après la connexion
modèle

sous math2 nécessite des transactions même si ziyuan_. new et default sont la même bibliothèque, using=ziyuan_newDoit être utilisé lors de l'appel.() appel de méthode

  ziyuan_app = ['math2', 'ziyuan']
  if model._meta.app_label in ziyuan_app:
   return "ziyuan_new"
  return 'default'
Copier après la connexion
Vous devez faire attention à l'utilisation de try dans le bloc atomique. Si une erreur de programme est détectée manuellement, le wrapper atomique ne pourra pas intercepter l'exception et il n'y aura pas de restauration. Soit le code dans le try n'affecte pas l'opération de transaction, soit l'exception est interceptée et levée pour qu'atomic puisse revenir en arrière normalement (car je n'ai pas remarqué ce problème, j'ai essayé pendant plusieurs jours sans succès, rappelez-vous)

Merci d'avoir lu, j'espère que cela aidera tout le monde, et merci pour votre soutien à ce site !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal