【问题标题】:Force a "lock" with Postgres and GO使用 Postgres 和 GO 强制“锁定”
【发布时间】:2017-08-24 17:17:53
【问题描述】:

我是 Postgres 的新手,所以这可能很明显(或者非常困难,我不确定)。

我想强制一个表或行一次“锁定”至少几秒钟。这将导致第二个操作“等待”。

我正在使用带有“github.com/lib/pq”的 golang 与数据库进行交互。

我需要这个的原因是因为我正在做一个监控 postgresql 的项目。谢谢你的帮助。

【问题讨论】:

  • 将事务隔离级别设置为可序列化postgresql.org/docs/9.1/static/sql-set-transaction.html
  • This 答案与您想要的非常相似。只需使用任何必要的隔离级别。
  • @Hackerman 嗯,效果很好。
  • OP 只需要记住,设置隔离级别是服务器的开销……更安全 -> 性能更低……这就是它的工作方式。
  • 另外一个事务也有可能由于序列化错误而失败。您可能还想使用“选择更新”。并准备好重试由于序列化错误而失败的事务。

标签: postgresql go locking load-generator


【解决方案1】:

您还可以使用 select ... for update 来锁定一行或多行交易的长度。

基本上是这样的:

begin;
select * from foo where quatloos = 100 for update;
update foo set feens = feens + 1 where quatloos = 100;
commit;

这将对 quatloos = 100 的 foo 表行执行排他行级锁定。任何其他尝试访问这些行的事务都将被阻止,直到运行 select for update 后发出提交或回滚。

理想情况下,这些锁应该尽可能短。

见:https://www.postgresql.org/docs/current/static/explicit-locking.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多