什么类型的请求适合“@transaction.non_atomic_requests”?

What types of requests make good candidate for `@transaction.non_atomic_requests`?

在 Web 上处理 transactions 的一种常见方法是将每个请求包装在一个事务中。在 Django 中,您可以在要为其启用此行为的每个数据库的配置中将 ATOMIC_REQUESTS 设置为 True。

它是这样工作的。在调用视图函数之前,Django 启动一个事务。如果生成的响应没有问题,Django 会提交事务。如果视图产生异常,Django 将回滚事务。

虽然这种交易模型的简单性很吸引人,但当流量增加时,它也会变得低效。为每个视图打开一个事务有一些开销。

对于不需要包裹在transactions中的请求,可以应用@transaction.non_atomic_requests装饰器。

给定一个 Django view.py,其中包含多个视图 类 和请求方法。我该如何决定哪些请求适合非原子装饰器?

"gotchas" 可能潜伏着什么?

我可以看到 POST 方法不是很好的候选人或任何具有 .save() 的方法,但我还应该注意什么?

遗憾的是,我不认为有很多提示、陷阱等普遍适用。问题只是:考虑到我可能执行的所有数据库操作,这一系列操作是否需要数据库事务才能正常工作?如果答案是肯定的(或者你不确定),使用事务;如果没有,不要。

这是一个非常针对具体应用的问题。以您的示例为例,在许多情况下 save() 需要交易,而在许多情况下则不需要。除了坐下来思考各种可能性,我不知道有什么替代方法。

最重要的是要很好地理解数据库事务,尤其是 isolation levels。人们常常错误地认为他们可以避免某些并发问题,因为他们的事务心理模型与 SERIALIZED 隔离级别相匹配,而实际上他们的操作使用 READ COMMITTED (Django 默认值)。

除了普通事务之外,了解和考虑您可以使用的其他可用工具也很重要,例如锁(例如 Django 的 select_for_update())和乐观并发。