繁体   English   中英

使用Npgsql的PostgreSQL Master Details事务处理

[英]PostgreSQL Master Details Transaction Handling using 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并使用它插入到明细表中。 现在的问题是,如果细节出现问题并且插入不成功,我想回滚插入到主表上的数据。 但是由于它已经承诺,所以我无法回滚它。 应该是全部或全部。 主表和详细信息表。

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

您可以使用单条语句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演示


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

BEGIN TRAN

INSERT INTO master ...

INSERT INTO child ...

COMMIT;

这样,您将获得全部或全部的行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM