python django事务实例源码解析
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要讲解了"python django事务实例源码解析",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"python django事务实例源码解析
千家信息网最后更新 2026年10月31日python django事务实例源码解析
这篇文章主要讲解了"python django事务实例源码解析",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"python django事务实例源码解析"吧!
python Django事务
# 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: math3下的model需要事务,即使ziyuan_new和default是同一个库,也必须使用useing=ziyuan_new
ziyuan_app = ['math3', 'ziyuan'] if model._meta.app_label in ziyuan_app: return "ziyuan_new" return 'default'
调用时候必须.()方法调用
atomic块中必须注意try的使用,如果手动捕获了程序错误会导致atomic包装器捕获不到异常,也就不会回滚。要么try内代码不影响事务操作,要么就捕获异常后raise出,让atomic可以正常回滚(就是因为没有注意到这个问题,导致尝试了好几天都没成功,切记)
感谢各位的阅读,以上就是"python django事务实例源码解析"的内容了,经过本文的学习后,相信大家对python django事务实例源码解析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
事务
实例
方法
源码
上下
上下文
内容
数据
数据库
程序
学习
管理
代码
就是
时候
粒度
要么
路由
问题
不同
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
耶加雪菲
精品咖啡豆
中国互联网科技股
没上市的科技互联网公司
中资互联网科技
互联网与新科技
中国互联网科技发展
迪茉互联网科技
善班互联网科技有限公司
科技创新互联网企业
万达互联网科技
亿人帮互联网科技
互联网养老 桔豆科技
北京大学互联网科技怎么样
科技与互联网哪个更好
苏州铭阳互联网科技有限公司
徐州市互联网科技有限公司
广东工业互联网大赛深圳学泰科技
西安左小互联网科技有限公司
六子台科技互联网展会
善班互联网科技
美国互联网黑科技
互联网女皇 腾讯科技
郑州华宇互联网科技
互联网科技的未来发展
互联网 新科技
多迪互联网科技有限公司
卫星互联网科技股票
区块链结合互联网科技
半导体是互联网高科技吗