python django 트 랜 잭 션 소스 분석 상세 설명

4232 단어 pythonDjango 사무
python Django 사무
인터넷 상에 서 django 1.6 에 관 한 사무 자료 가 많 지만 1.8 의 자 료 는 찾 을 수 없습니다.자신 이 사용 할 때 많은 힘 을 들 였 지만 안 됩 니 다.지금 은 사용 할 사람 을 적 게 기록 하 세 요.version:Django 1.8사무 공식 문서사무 중국어 문서에서 많은 방법 을 소개 합 니 다.군말 하지 않 고 문서 대로 하면 됩 니 다.다음은 atomic 방법의 소스 코드 만 분석 하고 공식 문서 transaction.atomic 에 따라 두 가지 용법 장식 기와 문맥 관리자 가 있 습 니 다.

# 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
python MySQLdb

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()

더 가 는 입자 의 스크롤 백:

#      @atomic()    with atomic():
sid = transaction.savepoint('tbkt_pxb')
try:
 # do ..........
except:
 transaction.savepoint_rollback(sid, 'tbkt_pxb')
메모:여러 데이터베이스 에 경로 가 있 으 면 경로 와 일치 하 는 useing:math 2 의 model 을 지정 해 야 합 니 다.ziyuan 이라도.new 와 default 는 같은 라 이브 러 리 이 며,useing=ziyuan 을 사용 해 야 합 니 다.new

  ziyuan_app = ['math2', 'ziyuan']
  if model._meta.app_label in ziyuan_app:
   return "ziyuan_new"

  return 'default'

호출 할 때 반드시.()방법 호출
atomic 블록 에 서 는 try 의 사용 에 주의해 야 합 니 다.프로그램 오 류 를 수 동 으로 캡 처 하면 atomic 포장 기 가 이상 을 포착 하지 못 하고 스크롤 백 하지 않 습 니 다.try 내 코드 가 트 랜 잭 션 에 영향 을 주지 않 거나 이상 을 포착 한 후에 raise 를 하여 atomic 가 정상적으로 스크롤 백 할 수 있 도록 합 니 다.(이 문 제 를 알 아차 리 지 못 해서 며칠 동안 시 도 했 지만 성공 하지 못 했 습 니 다.기억 하 세 요)
읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기