Django中的事务设置方法

使用Django配置交易的方法

关系型数据库管理系统(RDBMS)具有事务功能。你可以通过Django来进行设置。在Django中,默认情况下,每次查询执行完毕后都会进行提交。

 

Django的默认行为是在自动提交模式下运行。每个查询都会立即提交到数据库,除非有一个事务是活动的。有关详细信息,请参见下文。

您希望以更大的粒度(例如请求处理单元)来设置事务吗?

为了说明,我们准备了一个模型。 le , le .)

from django.db import models

class Disk(models.Model):
    name = models.CharField(max_length=30)

class Server(models.Model):
    name = models.CharField(max_length=30)
    disk = models.ForeignKey(Disk, on_delete=models.PROTECT)

我定义了Disk与Server之间的1对多关系。

假设有一个API,在创建服务器的同时也会创建磁盘。我认为以下实现可能是这样的。※我们使用了rest-framework。

class ~(APIView):
    def post(self, request, ~):
       ~
       disk = Disk.objects.create(name="disk0")
       server = Server.objects.create(name="server0", disk=disk)
       ~
   

在以上代码中,默认的事务行为是将每条记录单独反映到数据库中。

然而,如果在处理post请求时出现了问题,我们应该希望取消所有的记录创建。例如,如果磁盘创建成功后,服务器创建失败,我们应该希望磁盘创建被视为没有发生。在这种情况下,我们需要更改Django的事务设置。

我会给出两种方法。

请将请求在一次事务中封装。

修改settings.py文件中的DATABASES设置。

DATABASES = {
    "default": {
        ~
        "ATOMIC_REQUESTS": True,
        ~
    }
}

请注意,这将使每个请求处理被事务所包围。然而,这是一个全局设置。

不希望设定为全球性的,而是想要更精细的设置。

from django.db import transaction


@transaction.atomic
def view(request):
   ~

由于上述方法的个别设置,不会影响其他视图。

请参考

 

广告
将在 10 秒后关闭
bannerAds