我最近在一个视图中遇到了需要禁用事务请求的需求,以便能够在请求期间调用 db.connection.close()
和 connect()
以提高性能。
我有一个DRF视图集,并使用以下非常简单的视图来验证 non_atomic_requests 装饰器似乎没有任何效果。在 settings.py
中启用了 ATOMIC_REQUESTS=True
,并且 DEBUG=False
。
from django.db import transaction
@transaction.non_atomic_requests
def create(self, *args, **kwargs):
m = MyModel(stuff="hello")
m.save()
raise Exception('exception! row should still be saved though')
return Response()
调用视图之后,我打开Django shell并验证数据库中的行数没有增加,尽管它应该增加。在请求期间打开调试器,在
m.save()
行之后停止执行,我可以在Django shell中观察到新行尚不可见。如果在
settings.py
中设置ATOMIC_REQUESTS=False
,则代码按预期工作,并且即使从视图返回之前出现错误,数据库中的行数也会增加一个。当
ATOMIC_REQUESTS=False
时,使用@transaction.atomic
修饰符按预期工作。因此,我可以使用它将其他视图设置为原子视图以解决问题...我目前认为这是框架中的一个bug。有人能验证我的发现或指出我是否误解了此修饰符的功能吗?
我使用的是Python 3.6、Django 2.0和DRF 3.7.7。