【问题标题】:Understanding working of Django transactions了解 Django 事务的工作
【发布时间】:2013-01-12 19:51:28
【问题描述】:

我已经阅读了 Django 事务并打算在我的项目中使用它,但这里有几个我想知道的问题。实际上我希望在注册时使用事务,我在注册时在 2-3 个地方插入,所以我希望如果任何查询失败,则不应该执行插入。所以根据 Django 文档,我想我需要使用commit_on_success 类型的事务。

但我想知道这些事务是依赖于数据库还是都是 Django 内部的?我是否需要为它更改数据库存储引擎?如果我必须在不同的存储引擎甚至未来不同的数据库(例如 SQL 中的一个表和 nosql 中的一个表)上使用它怎么办?还是这无关紧要?

如果我会像这样使用它:

from django.db import transaction

def function1():
    #code here without transaction

@commit_on_success
def function2():
    #code here with transaction

如果所有方法代码都成功,那么函数 2 将与提交一起工作,但函数 1 在导入事务之前会发生什么? function1 将应用什么类型的事务?我希望 function1 没有任何事务,但在其他模型代码中工作时表现正常,那么我该怎么办?

所以我的问题是,如果没有交易但只有一种交易方法,该怎么办?它会通过使用装饰器和其他方法正常工作还是我需要做其他事情?这些事务是否也依赖于数据库和数据库存储引擎(如 InnoDB)?这些事务只是 Django 内部事务吗?

【问题讨论】:

    标签: django django-models transactions


    【解决方案1】:
    • Django 使用数据库事务。
    • 您不需要更改数据库存储引擎。
    • 并非所有数据库引擎都支持事务
    • 如果您使用事务管理,而您的数据库引擎不支持它(例如带有 MyISAM 表的 MySQL),一切仍然有效,无需事务。

    即在一种方法中使用@commit_on_success 是安全的。如果您将来在没有事务支持的情况下更改为 DB,一切都不会中断。

    【讨论】:

    • 是的 Marat 我需要将一张表更改为 innodb 并且它有效
    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 2017-07-09
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    相关资源
    最近更新 更多