为啥使用postgresql skip locked加锁失败

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥使用postgresql skip locked加锁失败相关的知识,希望对你有一定的参考价值。

参考技术A 是因为同时更新事物失误。
通常在数据库中最小粒度的锁是行锁,当一个事务正在更新某条记录时,另一个事务如果要更新同一条记录(或者申请这一条记录的锁),则必须等待锁释放。
通常持锁的时间需要保持到事务结束,也就是说,如果一个长事务持有了某条记录的锁,其他会话要持有这条记录的锁,可能要等很久。

Heroku 为啥使用 Postgresql?

【中文标题】Heroku 为啥使用 Postgresql?【英文标题】:Why does Heroku use Postgresql?Heroku 为什么使用 Postgresql? 【发布时间】:2011-05-22 14:49:01 【问题描述】:

我正忙着将一些 MySQL 特定代码移植到 Postgresql,以便与 Heroku 一起使用。只是想知道 Heroku 使用 Postgresql 而不是 MySQL 是否有任何具体原因?性能、架构等?

更新:来自 heroku blog post:

在 Heroku,我们相信 PostgreSQL 提供了最好的组合 强大的功能、数据完整性、速度、标准合规性和 地球上任何 SQL 数据库的开源代码。

【问题讨论】:

所说的强大功能之一可能是PostgreSQL的PostGIS扩展,它提供了非常强大的空间能力。我们将它用作辅助 DBMS,将​​ MongoDB 作为我们的主键值存储。 【参考方案1】:

Postgres 在many ways 中优于 mysql。您可以阅读这些关于从 mysql 到 postgres 迁移 rails 应用程序的帖子。虽然mysql是more popular而不是postgres,但是instagram is using postgres可能是由于these的原因。我觉得 postgres 比 mysql 成熟和健壮得多。而mysql更容易使用。

Migrating MySQL to PostgreSQL in Rails « m i n d l e v

Converting Rails application data from MySQL to PostgreSQL

对于数据迁移,一个方便的小脚本:Rake task to transfer a Rails database, say from MySQL to Postgres and back again

【讨论】:

感谢您的链接。不过,我认为说大多数初创公司选择 postgres 而不是 mysql 甚至都不是真的。我在一家使用 MySQL(以及 cassandra 和 mnesia)的初创公司工作。许多大公司(如 Yahoo! 和 Amazon)也使用 MySQL。 是的,这不是真的。 Facebook 和 Twitter 即使在早期也使用 MySQL。 我的错。经过一点研究mysql更受欢迎。我曾在山谷的 2 家初创公司工作过,他们都使用过 postgres。所以,我有偏见。更新答案。 是的,我怀疑很多初创公司在使用 MySQL 时并没有考虑太多。然后后悔了。我工作的地方用它,我工作的最后一个地方用它。 由于您发布的出色链接而授予您答案。谢谢。【参考方案2】:

我目前正在将我客户的一个 Rails 应用程序从 Heroku Postgresql 移动到 Mysql(ClearDB 插件)。 PostgreSQL 在很多方面都是一种更严格、更“正确”的数据库服务,这似乎是 Heroku 认可它的原因。然而,我发现 Rails 框架或多或少地消除了这些差异,并且大多数 Rails 应用程序不会增长到足以让 Mysql 的性能问题成为破坏者。

另一方面,PostgreSQL(尤其是 Heroku 的产品)对于启动应用程序有几个明显的缺点:

价格。为了防止在使用 Heroku Postgres 时每周出现“数据库连接丢失”错误,您必须每月支付 200 美元。在 ClearDB 上,您可以获得 100% 正常运行时间的承诺(我们还没有机会评估此声明)10 美元 / 月计划,该计划还提供 1 GB 空间——比我们更多永远需要。 列顺序。 在进行 Rails 开发时,我每 5 分钟参考一次schema.rb 数据库模式文件,为了保持该文件的整洁和可读性,我发现能够指定列的顺序非常重要被添加进来。 MySQL 支持指定列的顺序; PostgreSQL 没有。在很多情况下,这个功能并不重要,但是由于 Rails / ActiveRecord 的工作原理,当我无法重新排序列时,我的生活变得更加艰难。

【讨论】:

【参考方案3】:

不违背上述任何建议,但如果出于某种原因你真的想要或需要坚持使用 MySQL,我最近注意到 Heroku 现在提供了一个免费的 MySQL 插件,称为 ClearDB:

https://addons.heroku.com/cleardb

没用过,所以不能保证。 Heroku 声称免费版本的正常运行时间为 99.95%(相对于任何付费版本的正常运行时间为 100%),并且他们否认免费版本已“准备好生产”。他们声称 ClearDB 是“原生的、未经修改的 MySQL”。

【讨论】:

【参考方案4】:

将此MySQL gotchas 列表的长度与此postgresql gotchas 列表的长度进行比较。 MySQL 更有可能把你搞砸。

【讨论】:

【参考方案5】:

一般来说,我发现 pgsql 比 mysql 更适合 24/7 操作。此外,它似乎内置了更少的脚枪。我认为,如果您对其中一个更熟悉,那比其他任何事情都更有可能影响您的决定。

【讨论】:

+1 用于使用术语“footgun”。如果您打开所有严格选项以使其假装它是一个真实的数据库,MySQL 会好得多,而不是默默地增加时间戳或截断超过指定 varchar 长度的数据等。Postgres 开箱即用即可正常工作。【参考方案6】:

嗯,Postgres 的性能通常更适合复杂的查询,比如 ORM 生成的那种。此外,postgres 往往更“稳固”。这是陈词滥调,但我管理的 postgres 服务器总是比 mysql 麻烦得多,mysql 喜欢偶尔随机崩溃一次,偶尔会在崩溃的过程中损坏表。

【讨论】:

我听说(传闻)postgres 也更可靠。我想知道他们的决定还基于什么。 是的,我就是这么说的:坚实。整个系统,包括文档,都散发着坚实的工程气息,而 MySQL 总是更“嗯,这对 web 来说已经足够好了”。

以上是关于为啥使用postgresql skip locked加锁失败的主要内容,如果未能解决你的问题,请参考以下文章

在 JOOQ 中使用 NOWAIT 和 SKIP LOCKED 子句的解决方法

使用 FOR UPDATE SKIP LOCKED 打开 OUT SYS_REFCURSOR 时出错

为啥 MongoDB skip() 不使用索引?

强制 Oracle 返回带有 SKIP LOCKED 的 TOP N 行

Oracle给Select结果集加锁,Skip Locked(跳过加锁行获得可以加锁的结果集)

如何在与 SQLAlchemy 和 psycopg2 的 PostgreSQL 连接上设置“lock_timeout”?