【问题标题】:Does Postgres guarantee to lock rows in the order of supplied update-statements?Postgres 是否保证按照提供的更新语句的顺序锁定行?
【发布时间】:2017-06-04 22:06:50
【问题描述】:

我喜欢批量更新 Postgres。有时,批处理可能包含对同一记录的更新语句。 (*)

为此,我需要确保 Postgres 根据提供更新语句的顺序锁定行。

这是有保证的吗?

明确地说,我发送的是一系列单行更新语句,而不是单个多行更新语句。例如:

update A set x='abc', dt='<timeN>' where id='123'; 
update A set x='def', dt='<timeN+1>' where id='123'; 
update A set x='ghi', dt='<timeN+2>' where id='123'; 

*) 这似乎是多余的:只保存最后一个。但是,我在表上定义了一个后触发器,因此历史记录是在另一个表中创建的。因此我需要多次更新。

【问题讨论】:

  • 如果这是单个事务,那么 postgres 只持有一个锁(假设 id 是主键)

标签: postgresql


【解决方案1】:

这些行肯定会按照UPDATE 语句的顺序被锁定。

此外,锁只影响并发事务,因此如果所有UPDATEs 都发生在一个数据库会话中,您不必害怕被锁阻塞。

【讨论】:

  • 太棒了。所以在上面的例子中,update-statement 1 将锁定 id=123 的行。更新语句 2 和 3 无法继续,因为它们影响同一行。 update-statement 1 完成后会释放行锁,因此 update-statement 2 可以获取锁并开始执行,等等。对吗?
  • 如果这三个语句在不同的数据库会话中运行是正确的。如果语句同时运行,则它们的执行顺序没有明确的顺序,但它们会一个接一个地执行。如果它们在一个事务中运行,它们将不会相互锁定。
  • 哦,嗯。所以要清楚,我想在 1 个数据库会话中运行上述语句。这意味着它们将同时运行,并且没有明确的顺序对吗?如果我想强制执行提供的语句顺序怎么办?即:带有`dt='''的语句应该在dt='&lt;timeN+1&gt;'之前运行应该在dt='&lt;timeN+2&gt;'之前运行。这有可能吗?
  • 不,如果它们在单个数据库会话中运行,它们会从上到下一个接一个地执行。锁不进入画面。
猜你喜欢
  • 1970-01-01
  • 2019-01-29
  • 1970-01-01
  • 2021-10-09
  • 1970-01-01
  • 1970-01-01
  • 2015-01-17
  • 1970-01-01
  • 2014-05-12
相关资源
最近更新 更多