6

在我正在工作的项目中,有一个带有“更新时”触发器的表,用于监视布尔列是否已更改(例如:false -> true = 执行某些操作)。但是这个动作只能连续做一次。

将有多个客户端访问数据库,所以我可以假设最终,多个客户端将尝试并行更新同一行列。

“更新”触发器本身是否处理并发本身,或者我需要在事务中执行并手动锁定表?

4

1 回答 1

17

触发器不处理并发,无论您是否使用显式事务,PostgreSQL 都应该做正确的事情。

PostgreSQL 使用乐观锁,这意味着第一个真正更新行的人会获得该行的锁。如果第二个人尝试更新该行,他们的更新语句会等待看第一个人是提交他们的更改还是回滚。

如果第一个人提交,第二个人会得到一个错误,而不是他们的更改经历并消除了他们可能感兴趣的更改。

如果第一个人回滚,第二个人的更新会解除阻塞,并正常进行,因为现在它不会覆盖任何内容。

第二个人也可以使用该NOWAIT选项,如果他们的更新与未解决的更改冲突,则该选项会立即发生错误而不是阻塞。

于 2008-11-25T23:55:14.150 回答