gpt4 book ai didi

python - Django 最佳实践——在执行业务逻辑时保证原子性

转载 作者:行者123 更新时间:2023-12-05 03:49:43 24 4
gpt4 key购买 nike

我正在重构 Python/Django 应用程序上的一些遗留代码,我正在寻找有关在 SQL 数据库上执行操作的样式/最佳实践建议。

现在我正在尝试修改以下代码:

def fun():
try:
with transaction.atomic():
# query DB

# do business logic

# update DB entries with new values
except:
# handle exception

问题是,在我的查询和更新之间存在大量的业务逻辑。但是我觉得在另一个缩进下添加额外的代码是没有意义的/即定义为数据库事务的一部分。理想情况下,我想清理它并且只执行某些原子操作。我想它实际上不会减少我的代码行数,但我很好奇 transaction.atomic() 实际上完成了什么?

根据我对原子性的理解,读取实际上并不会影响数据存储的状态,因此我不完全确定初始读取是否属于 atomic()

提前致谢。

最佳答案

如果读取只是简单的 SELECT 语句,并且您使用默认的 READ COMMITTED 事务隔离级别,并且更新是单个 SQL 语句,那么您是对的.

但是:

  • 如果有多个数据修改语句(比如,你修改了多个表中的行),使用事务可能是必不可少的,这样就永远不会发生这些语句中只有一个是执行。

    在这种情况下,最好在修改数据之前立即开始事务。

  • 对于 REPEATABLE READ 或更高级别的事务隔离级别,必须在事务中包含 SELECT 语句,因为数据库的“快照”(应用于事务的数据库的状态)在执行事务中的第一条 SQL 语句时获取。您需要 UPDATE,以便看到与 SELECT 相同的数据库状态。

  • 如果 SELECT 有一个 FOR UPDATE 子句,这实际上会锁定表行以防止并发修改。在这种情况下,您需要在与数据修改相同的事务中使用 SELECT,因为事务结束时会释放锁。

总而言之,最好使数据库事务尽可能短。这降低了死锁的风险并使架构更改变得轻松。

关于python - Django 最佳实践——在执行业务逻辑时保证原子性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63770672/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com