【发布时间】:2016-12-15 15:51:45
【问题描述】:
我正在从 ORACLE 迁移。目前我正在尝试移植这个调用:
lkstat := DBMS_LOCK.REQUEST(lkhndl, DBMS_LOCK.X_MODE, lktimeout, true);
This function 尝试获取锁lkhndl,如果在timeout 秒后未能获取,则返回 1。
在我使用的 postgresql 中
pg_advisory_xact_lock(lkhndl);
但是,它似乎永远等待锁定。 pg_try_advisory_xact_lock 如果失败则立即返回。有没有办法实现锁获取的超时版本?
有lock_timeout 设置,但我不确定它是否适用于advisory locks 以及pg_advisory_xact_lock 在超时后的行为。
【问题讨论】:
-
你可以设置一个
statement_timeout,比如SET LOCAL。不幸的是,这是会话(或LOCAL,事务)级别,而不是语句级别。 -
我没关系。但是超时后会发生什么?我如何知道是否获得了锁?
-
超时后,执行被中止,我认为您甚至无法捕获这些错误。为了完全模拟那个 Oracle 函数,恐怕你需要编写一个重试循环,可能有
pg_sleep()调用(但是我不确定它是如何执行的,我从来没有写过这样的东西)。 -
哦,我担心会是这样的:(
-
老实说,我们似乎真的可以使用补丁来实现类似于您现在在 Oracle 中使用的功能的功能。你的 C 编程怎么样?
标签: sql oracle postgresql locking database-migration