不久前,我花了噩梦般的几周时间来处理“检测到死锁”并试图找出如何处理它。我最终以这样的方式处理它:我的代码能够检测到它何时发生,然后无限期地重试相同的查询,每次重试之间间隔 50000 微秒,直到它起作用。
也许这是不好的做法,但到目前为止(几个月),除了记录“检测到死锁”所谓的“错误”之外,它还没有引起任何问题。
我现在可以通过将“检测到死锁”错误标记为“不重要”来抑制它们,从而不会向我显示,即使它们仍然记录到我的错误日志表中,这是否“可以”?
请不要告诉我“首先避免它们”。这根本不可能。如果您在同一个表/事物上并发(多个进程/脚本实例)工作,它们显然会发生。我花了很长时间试图“将它们编码掉”,但这似乎是不可能的。
显然,因为我问这个问题而不是仅仅添加忽略规则并完成它,所以我确实关心答案/响应。尽管如此,我认为目前还不能确信它们可以完全避免。我并不是说我每小时都会记录数千个记录,而是每天都会记录一些记录,似乎总是在一开始,当我确实有很多并发进程在同一个表/查询上工作时。
我有一个带有“电子邮件地址”和“P2PMail 地址”列的表格。用户需要输入电子邮件或 P2PMail 地址。
如果我将两者都设置为NOT NULL
,则必须同时填写两者才能创建记录。
如果我允许两者都为NULL
,那么用户将完全无法访问。
如果我UNIQUE CONSTRAINT
在两列上都设置了 a ,那么它们的组合必须是唯一的,但它并没有说明我想要做什么......除非我在这里思考错误。
实现这一目标的正确方法是什么?我担心答案是令人不快的东西,例如“触发器”之类的东西。(我从不习惯使用这些。)
对于所有这些查询:
SELECT label FROM personal.storage_disks ORDER BY label ASC;
SELECT label FROM personal.storage_disks ORDER BY label COLLATE "C" ASC;
SELECT label FROM personal.storage_disks ORDER BY label COLLATE "POSIX" ASC;
SELECT label FROM personal.storage_disks ORDER BY label COLLATE "default" ASC;
Run Code Online (Sandbox Code Playgroud)
输出总是:DISK 1, DISK 10, DISK 2, DISK 3, [...]
但是,我想要并期望:DISK 1, DISK 2, DISK 3, [...] DISK 10
我现在没有根据SELECT * FROM pg_collation;
......尝试的排序规则,除非我应该使用具有神秘名称的许多非常奇怪的排序规则之一。(我什至尝试了一堆结果相同的方法。)
请注意,我已经阅读了现有的看似相关的 SE 问题以及许多关于 的文章SORT BY
,但它们没有帮助,也没有为我清除任何内容。
我正在使用 PostgreSQL 12.4
我知道 PostgreSQL 仅自动为足够小的表使用 RAM。但我不仅仅谈论表内的数据,而是谈论整个表本身。
基本上,我(很差地)在 PHP 数组中重新实现了各种数据库功能,例如,当我从 API 获取数据并希望在将其显示在控制面板中之前对其进行排序或“按摩”时。在这种情况下,拥有一个仅用于此目的且带有临时数据的实际数据库表是没有意义的(至少对我来说)。如果我可以即时创建一个表,将其填充到 RAM 中,进行排序,然后使用普通的 PG SQL 查询从中获取记录,那就更好了。
这是一件事吗?我有数组结构和各种试图模仿 SQL 的“SORT BY”的函数,这感觉很愚蠢。
当然,我不是在谈论执行CREATE TABLE
,向其中添加数据,然后再次返回给 PHP,然后DROP TABLE
. 这对于性能来说是非常糟糕的。
如果没有办法做到这一点,我就会接受它,但我常常认为这是非常有意义的。