Heim  >  Artikel  >  Backend-Entwicklung  >  Einführung in die Quellcodeanalyse von Python-Django-Transaktionen

Einführung in die Quellcodeanalyse von Python-Django-Transaktionen

高洛峰
高洛峰Original
2017-03-19 09:18:151640Durchsuche

Dieser Artikel stellt hauptsächlich die relevanten Informationen zur Python DjangoTransaktions-Quellcode-Analyse vor. Freunde in Not können sich auf

Python Django-Transaktion

Es gibt viele Informationen über Django 1.6 im Internet, aber ich kann keine Informationen über 1.8 finden. Ich habe mir viel Mühe gegeben, als ich es verwenden wollte, aber das war nicht der Fall Jetzt gibt es nur wenige Leute, die es zur Kenntnis genommen haben: Das offizielle Dokument zur Django-1.8-Transaktion. Ich werde nicht einzeln auf das Dokument eingehen Analysiert nur den Quellcode der atomaren Methode, es gibt zwei Verwendungszwecke: Dekorator und Kontextserver

# 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
Feinkörniges Rollback:

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()
Hinweis: Wenn mehrere Datenbanken mit Routen vorhanden sind, müssen Sie „Konsistent mit Routing verwenden“ angeben:

Modell

unter math2 erfordert Transaktionen. Auch wenn ziyuan_ erforderlich ist.
# 在事务块中@atomic() 或者 with atomic():
sid = transaction.savepoint('tbkt_pxb')
try:
 # do ..........
except:
 transaction.savepoint_rollback(sid, 'tbkt_pxb')
new

und default sind dieselbe Bibliothek, using=ziyuan_newMuss beim Aufrufen verwendet werden.() MethodenaufrufSie müssen darauf achten die Verwendung von try im atomaren Block. Wenn ein Programmfehler manuell abgefangen wird, kann der atomare Wrapper die Ausnahme nicht abfangen und es erfolgt kein Rollback. Entweder hat der Code im Versuch keinen Einfluss auf den Transaktionsvorgang, oder die Ausnahme wird abgefangen und ausgelöst, sodass Atomic ein normales Rollback durchführen kann (da ich dieses Problem nicht bemerkt habe, habe ich es mehrere Tage lang ohne Erfolg versucht, denken Sie daran)

  ziyuan_app = ['math2', 'ziyuan']
  if model._meta.app_label in ziyuan_app:
   return "ziyuan_new"
  return 'default'
Danke fürs Lesen, ich hoffe, das hilft allen und vielen Dank für Ihre Unterstützung dieser Website!

Das obige ist der detaillierte Inhalt vonEinführung in die Quellcodeanalyse von Python-Django-Transaktionen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn