sql - 使用 Npgsql 的 PostgreSQL Master Details 事务处理

标签 sql postgresql npgsql

假设我有这些表:

CREATE TABLE master 
master_id serial, 
master_desc character varying

CREATE TABLE details
details_masterrefid int,
details_desc character varying
CONSTRAINT master_detail_fkey(details_masterrefid)
REFERENCES master(master_id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION

然后我有一个 C# 代码,它基本上会先将表头插入到主表中,然后遍历详细信息并将其插入到详细信息表中。

通过这样做,我必须先插入主表,然后提交事务,如果成功,获取 ID 并使用它插入明细表。现在的问题是,如果细节出了问题,插入不成功,我想回滚在master表上插入的数据。但由于它已经提交,我无法将其回滚。它应该是全有或全无。主表和明细表。

我能想到的唯一解决方案是允许详细信息中的外键字段可为空,然后如果一切成功,则将外键字段更新为其各自的值。关于如何做得更好的任何建议?我不知道它是否是一个有效的解决方案。

最佳答案

您可以使用单个语句 CTE:

WITH ins1 AS (
  INSERT INTO master (cols...)
  VALUES (..)                            -- insert into master
  RETURNING master_id                    -- get generated id
)
INSERT INTO details (...)
SELECT master_id, ...                    -- insert into child table
FROM ins1;

Rextester Demo


另一种方法是用单个事务包装所有内容:

BEGIN TRAN

INSERT INTO master ...

INSERT INTO child ...

COMMIT;

这样你就会得到全有或全无的行为。

关于sql - 使用 Npgsql 的 PostgreSQL Master Details 事务处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45856849/

相关文章:

c# - 什么是限制请求数?为什么是 `Timeout while getting a connection from pool` ?

c# - 有没有办法在运行时动态加载数据提供者?

sql - 使用 Oracle SQL Developer 作为我的客户端时如何为 SQL Server 调用 sp_help [table]

mysql - 无法弄清楚如何连接表

sql - 如何从返回随机行的选择中获取剩余数据

mysql - postgres 的 phpmyadmin 扩展

c# - ConcurrentQueue 上的 PLINQ 不是多线程

mysql - 多重内连接关注点

sql - 如何返回结果集以及删除

postgresql - 检索大列的压缩(二进制格式)