【问题标题】:Run code block in a transaction in postgres在 postgres 的事务中运行代码块
【发布时间】:2020-02-27 23:26:19
【问题描述】:

我想在事务中运行以下代码块,以便如果任何sql statements 失败,整个事务都会中止。如果我按原样运行以下块,它是在事务中运行还是需要在 BEGIN; ... COMMIT; 中运行它?

DO $$
  DECLARE
    readonly_exists int;
BEGIN
  SELECT COUNT(*) INTO readonly_exists FROM information_schema.enabled_roles
    WHERE role_name = 'readonly';
  IF readonly_exists = 0 THEN
    <SQL STATEMENT 1>
    <SQL STATEMENT 2>
    <SQL STATEMENT 3>
  ELSE
    RAISE EXCEPTION 'readonly role already exists';
  END IF;
END$$;

【问题讨论】:

    标签: postgresql postgresql-11


    【解决方案1】:

    任何 SQL 语句始终在单个事务中运行(此规则的例外是 CALL)。

    因此您的DO 语句将在单个事务中运行,并且三个 SQL 语句要么全部成功,要么全部回滚。

    【讨论】:

    • 我在几个地方看到 DO 语句在 BEGIN COMMIT 中运行。这是一个好习惯吗?我的意思是,如果DO 语句本身在事务中运行,那么在BEGIN COMMIT 中运行它有什么意义@
    • 由于 PostgreSQL 使用自动提交模式,DO 语句默认会在自己的事务中运行。如果您希望其他 SQL 语句与 DO 语句在同一事务中运行,则使用 BEGIN 显式启动事务。
    猜你喜欢
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 2021-07-28
    • 2010-10-31
    • 2011-04-01
    • 2017-09-22
    • 2017-01-10
    • 2020-09-24
    相关资源
    最近更新 更多