AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 315295
Accepted
Lance
Lance
Asked: 2022-08-06 20:23:16 +0800 CST2022-08-06 20:23:16 +0800 CST 2022-08-06 20:23:16 +0800 CST

使用 READ COMMITTED 对并发写入安全的查询,对 SERIALIZABLE 隔离级别也安全?

  • 772

我用一个非常有用的答案问了这个问题:
如何对跨多个表的结构进行唯一性约束?

Erwin Brandstetter 的回答表明了这一点:

WITH ins_string_properties AS (
  INSERT INTO string_properties (source_id, name, value)
  VALUES (gen_random_uuid(), 'slug', 'hello-world')
  ON CONFLICT DO NOTHING  -- to silence unique violation errors
  RETURNING source_id
  )
, ins_objects AS (
  INSERT INTO objects (id, type)
  SELECT o.id, o.type
  FROM   ins_string_properties isp  -- always 0 or 1 rows
  CROSS  JOIN LATERAL (
      VALUES 
        (isp.source_id    , 'baz')
      , (gen_random_uuid(), 'foo')
      , (gen_random_uuid(), 'bar')
      ) o(id, type)
  RETURNING id, type
  )
INSERT INTO object_properties (source_id, name, value_id)
SELECT io1.id, io2.type, io2.id
FROM   ins_objects io1
JOIN   ins_objects io2 ON io1.type = 'foo' AND io2.type = 'bar'
                       OR io1.type = 'bar' AND io2.type = 'baz'
;

我只是在学习 CTE,但答案是:

READ COMMITTED在具有默认事务隔离的并发写入负载下也是安全的。

我将在 CockroachDB 中使用它,他们似乎建议避免READ COMMITTED使用它SERIALIZABLE。

我可以将此查询与. 一起使用吗SERIALIZABLE,或者如果不可以,为什么不 / 必须修改什么以使其与SERIALIZABLE. 这些事务级别对我来说是新的,过去我主要使用 PostgreSQL 和 Ruby on Rails ORM,所以没有深入研究 SQL。只是尝试使用SERIALIZABLECockroachDB 推荐的默认事务隔离级别,并且不确定我是否/何时可以/不能使用它,并且不确定这种情况。

这就是我对READ COMMITTEDvs.的了解SERIALIZABLE。

postgresql transaction
  • 1 1 个回答
  • 41 Views

1 个回答

  • Voted
  1. Best Answer
    Erwin Brandstetter
    2022-08-06T20:50:25+08:002022-08-06T20:50:25+08:00

    ... CockroachDB ...似乎建议避免READ COMMITTED使用SERIALIZABLE。

    实际上,根据手册,这不仅仅是一个建议。CockroachDB 使用SERIALIZABLE快照隔离,期:

    与大多数数据库相比,CockroachDB 总是使用SERIALIZABLE隔离

    但这对这个解决方案没有任何问题。SERIALIZABLE仅比 更严格READ COMMITTED。如果有的话,您有更多的余地,同时仍然可以安全地应对并发写入负载的竞争条件。这是根据 SQL 标准。
    但是没有必要,因为解决方案应该尽可能快。问题SERIALIZABLE是它更贵。至少在 Postgres 中是这样的。

    在讨论“Postgres vs CockroachDB”的主题时。手册中的一个建议:

    Cockroach Labs 建议您对主键列使用多列主键或 UUID 数据类型。

    您的表object_properties可能应该删除添加的代理id并PRIMARY KEY (source_id, value_id)改用 - 也替换我建议CONSTRAINT object_properties_uni UNIQUE (source_id, value_id)的 .

    • 1

相关问题

  • 我可以在使用数据库后激活 PITR 吗?

  • 运行时间偏移延迟复制的最佳实践

  • 存储过程可以防止 SQL 注入吗?

  • PostgreSQL 中 UniProt 的生物序列

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve