Postgresql 如何在pgsql中的函数调用期间锁定(独占)记录?

Postgresql 如何在pgsql中的函数调用期间锁定(独占)记录?,postgresql,Postgresql,在pgsql中,如何在函数运行期间锁定记录?考虑以下功能 create or replace function foo.bar_func(int)returns int as $$ with s as (select * from foo.bar where id=$1);-- <--lock the fetched row [BEGIN] /* Some query, update, insert, ... */ select coalesce(s.id,-1) from s;--r

在pgsql中,如何在函数运行期间锁定记录?考虑以下功能

create or replace function foo.bar_func(int)returns int as $$

with s as (select * from foo.bar where id=$1);--  <--lock the fetched row [BEGIN]
/*
Some query, update, insert, ...
*/
select coalesce(s.id,-1) from s;--return something.
-- <-- release the locked row [END]
$$ language sql;
我喜欢锁定在函数开始时找到的rowif,直到它完成其工作。 pg_advisory_lockbigint如何工作?它在这里有用吗?与select for update有什么区别?

select…for update执行您期望的操作,即在当前事务结束之前以独占方式锁定返回的行

另一方面,建议锁是应用程序定义的。它们被保留到当前事务结束或当前会话结束。因此,需要手动检查它们,您可能需要手动释放它们

如果想在示例代码中使用像s这样的变量,就必须使用PL/pgSQL。然而,似乎没有一种方法可以使您的函数具有事务性。相反,它将始终在周围事务的上下文中执行。将EXCEPTION子句添加到函数中会导致函数被包装在子事务中,但函数获取的锁将一直保留到周围事务结束。我用第9.3页进行了测试