我应该在交易中包含SELECT吗?

Sco*_*ord 5 database django postgresql transactions

使用数据库事务将多个更新分组时,我是否应该在事务中包含SELECT?例如,让我说:

  1. 得到一个记录
  2. 使用记录中的数据检查该记录的编辑权限
  3. 更新一些记录
  4. 更新一些其他记录

我应该在"获取记录"阶段之前开始交易,还是围绕更新?

我正在使用Postgres/Django,transaction.atomic()但我认为这不重要.

Cra*_*ger 5

简短版本:“这取决于”。

长版:

如果您正在执行读-修改-写循环,那么它不仅必须在事务中,而且您必须SELECT ... FOR UPDATE在以后打算修改的任何记录中进行。否则,您将面临丢失写入的风险,您会在读取记录和写入更新之间覆盖其他人所做的更新。

SERIALIZABLE 事务隔离也可以帮助解决这个问题。

您确实需要了解并发和隔离。不幸的是,唯一不理解它的简单、容易的“只做 X”的答案是通过锁定所有涉及的表来开始每个事务。大多数人不想这样做。

我建议阅读(或两个、三个或四个——这是硬材料)tx 隔离文档。尝试并发psql会话(多个终端)以创建竞争条件和冲突。