- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
PostgreSQL 中有一种锁定机制,称为advisory locking。 .它提供以下 API functions .
允许我们获得这种锁的函数接受一个大整数参数:pg_advisory_lock(key bigint)
或两个整数键:pg_advisory_lock(key1 int, key2 int)
(第二种形式)。
我可以使用什么抽象机制来使用字符串键而不是整数键?也许一些散列函数能够完成这项工作?
是否可以仅在 PostgreSQL 中实现这一点,而无需在应用程序级别将字符串转换为整数?
如果难以实现预期的目标,也许我可以使用两个整数来标识表中的行。第二个整数可以是行的主键,但我可以使用什么整数作为表标识符?
最佳答案
您已经找到了最有可能的候选者:使用表的合成主键加上表标识符作为键。
您可以使用来自 pg_class
的表的 oid(对象标识符)来指定表。转换为伪类型 regclass
的便利为您查找,或者您可以 select c.oid from pg_class c inner join pg_namespace n where n.nspname = 'public' and c. relname = 'mytable'
按模式获取它。
有一个小问题,因为 oid
在内部是一个无符号的 32 位整数,但是 pg_advisory_lock
的双参数形式需要一个有符号 整数。这在实践中不太可能成为问题,因为在这成为问题之前您需要检查很多 OID。
例如
SELECT pg_advisory_lock('mytable'::regclass::integer, 42);
但是,如果您要这样做,您基本上是在使用咨询锁来模拟行锁定。那么为什么不直接使用行锁定呢?
SELECT 1
FROM mytable
WHERE id = 42
FOR UPDATE OF mytable;
现在,如果您真的必须使用字符串键,您将不得不接受会发生冲突,因为您将使用相当小的散列。
PostgreSQL 具有用于哈希连接的内置哈希函数。它们不是加密散列——它们被设计为速度很快并且产生的结果相当小。这就是您为此目的所需要的。
它们实际上散列为 int4,而您真的更喜欢 int8,因此您会面临更高的冲突风险。不过,另一种方法是采用像 md5 这样的慢速加密散列并截断它,但这很丑陋。
所以如果你真的、真的觉得你必须这么做,你可以这样做:
select pg_advisory_lock( hashtext('fredfred') );
...但前提是您的应用能够处理其他字符串不可避免地会产生相同散列的事实,因此您可能会看到未真正锁定的行被“锁定”。
关于postgresql - 如何使用字符串作为 PostgreSQL 咨询锁的键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29353845/
我有一个使用laravel框架运行的网站,该网站需要迁移到公共(public)云VM。不过,我对 laravel 不太熟悉,任何建议和意见将不胜感激。 我已经创建了一个远程虚拟机,并安装了 Nginx
任何人都知道我如何向您展示使用 QSqlDatabase 将数据插入 mysql 数据库的进度? 最佳答案 为了拥有QProgressBar,您必须为要插入到数据库中的数据分配某种值,所以只要您知道数
是和 friend 一起的爱好项目,但由于我将投资于它(用于 UI/UX 设计),我需要确定可行性。我自己是一名程序员,但我不认为有 JS 和 HTML5 方面的经验。 [说明] 我将在 JS 和 H
我该如何修复此建议消息? 与此相关的 VM 是一个 Web 服务器,位于 Azure LoadBalancer 后面。导致此问题的 NSG 规则(只有 1 个“非默认规则”)是: Type: Allo
正在调用reset在我的 NSManagedObjectContext当我收到内存不足警告时我应该考虑做些什么?使任何指向 NSManagedObject 的指针无效会有点困难。是那些闲逛的,但如果它
我有一个使用 POSIX 建议锁来锁定文件的 C++ 程序。也就是说,它使用 POSIX fcntl system call用于锁定操作。我希望 Java 程序与该 C++ 程序互操作,因此我希望我的
我已经定义了 MACRO,它将调用函数并传递参数。在这种情况下低于 MISRA 警告。不允许吗?如何避免这种情况? 在 MACRO 中调用函数有什么好处? Referred Link 1 Referr
我在定义 MACRO 但未在代码中的任何地方使用时观察到上述警告。但在某些情况下,我会收到针对代码中使用的 MACRO 的警告。 我定义了宏 - INVALIDATION_ADDR 并在某些地方使用。
我是一名优秀的程序员,十分优秀!