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 가 정상적으로 스크롤 백 할 수 있 도록 합 니 다.(이 문 제 를 알 아차 리 지 못 해서 며칠 동안 시 도 했 지만 성공 하지 못 했 습 니 다.기억 하 세 요)
읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.