来自Postgers 文档:“您不能在 PL/pgSQL 函数中使用 COMMIT。该函数在某些外部事务中运行,因此 COMMIT 将意味着该函数的终止。”
通过 Google 和科学研究,我意识到 Postgres 中的函数执行的代码是原子的。我们也无法在其中显式声明事务;我们会收到错误。
请告诉我:
- 如果可能的话,请详细说明事务性在 PL/pgSQL 函数中通常如何工作?
- 我感兴趣的具体问题是:这些隐式“外部”事务的隔离级别是什么?首先,从并行事务和行上施加的锁的变化的可见性的角度来看,这是有趣的(如果 Postgres 这样做,我表面上熟悉 MVCC 概念)。
与任何请求相同:
那么,要调用函数,您需要发送请求。因此,函数调用始终位于外部事务内部,显式或隐式打开。
如果在打开事务时未明确请求,则隔离级别将按照设置中指定的方式使用
default_transaction_isolation(通常是已提交读)。事务中有关锁、数据 MVCC 快照可见性的所有行为都遵循通常的规则。从PL/pgSQL的具体情况来看,我们只能在使用块时提到隐式保存点EXCEPTION,这根本不是免费的。