使用多数据库的Django事务

Django transaction using multi-db(使用多数据库的Django事务)
本文介绍了使用多数据库的Django事务的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有三个数据库,我想在一个请求的事务中向它们添加数据。

例如我的代码。

@transaction.commit_manually
def my_view(request):
    try:
        MyModel_one(...).save(using='default')
        MyModel_two(...).save(using='db_one')
        MyModel_three(...).save(using='db_two') # <-- for example we make exception here (duplicate data)
    except IntegrityError:
        transaction.rollback()
        transaction.rollback(using='db_one')
        transaction.rollback(using='db_two')
        return ...
    transaction.commit()
    transaction.commit(using='db_one')
    transaction.commit(using='db_two')
    return ...

结果:

  1. MyModel_One-数据未保存
  2. MyModel_Two-数据已保存(我不知道为什么)
  3. MyModel_Three-由于希望错误,数据未保存

问题:为什么事务在这里不起作用?我可以做些什么来获得工作事务处理?

(我尝试了其他方法,但没有成功) (我也知道这不是很漂亮的代码,但很容易理解这个问题)

Django 1.7.7 Python2.7

数据库: 默认-Postgres DB_ONE-MySQL DB_TWO-MySQL

推荐答案

Django1.6中的transaction.commit_manually修饰符was deprecated。您应该切换到Django的新事务管理。

我认为您不需要手动提交事务,您可以嵌套transaction.atomic

def my_view(request):
    try:
        with transaction.atomic(using='default'):
            with transaction.atomic(using='db_one'):
                with transaction.atomic(using='db_two'):
                    MyModel_one(...).save(using='default')
                    MyModel_two(...).save(using='db_one')
                    MyModel_three(...).save(using='db_two') # raises exception
    except IntegrityError:
        return ...
    return ...

这篇关于使用多数据库的Django事务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Leetcode 234: Palindrome LinkedList(Leetcode 234:回文链接列表)
How do I read an Excel file directly from Dropbox#39;s API using pandas.read_excel()?(如何使用PANDAS.READ_EXCEL()直接从Dropbox的API读取Excel文件?)
subprocess.Popen tries to write to nonexistent pipe(子进程。打开尝试写入不存在的管道)
I want to realize Popen-code from Windows to Linux:(我想实现从Windows到Linux的POpen-code:)
Reading stdout from a subprocess in real time(实时读取子进程中的标准输出)
How to call type safely on a random file in Python?(如何在Python中安全地调用随机文件上的类型?)