2008-11-25 30 views
5

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

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

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

+0

当有许多触发器同时激活时,您是否观察到任何显着的性能下降? – ady 2015-05-11 11:41:47

回答

17

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

PostgreSQL使用乐观锁定这意味着第一个实际更新行的人在该行上获取锁定。如果第二个人试图更新该行,他们的更新语句将等待第一个人是否提交更改或回滚。

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

如果第一个人回滚,第二个人的更新解除阻塞并且正常通过,因为现在它不会覆盖任何东西。

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

+1

+1使用“消除”一词。 – swasheck 2012-01-26 23:15:40