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):
~
由于上述方法的个别设置,不会影响其他视图。
请参考