【问题标题】:Related insert fails in transationscope相关插入在 transationscope 中失败
【发布时间】:2009-09-15 11:15:05
【问题描述】:

我正在使用 TransactionScope 将对象的数据添加到一个数据库中。

伪代码:

using (TransactionScope trx = new TransactionScope())
{
   SqlConnection con = DL.GetNewConn();
   int newParentRecordID = InsertParentIntoTableA(object parent, con);

   foreach(obj child in parent.childrenObjects)
   {
       child.ParentID = newParentRecordID ;
       int newChildRecordID =  InsertChildIntoTableB(object child, con);
   }
   trx.Complete();
}

我在 InsertChildIntoTableB() 处遇到异常,错误是 TableB 中的 ParentID 在 TableA 中没有匹配的主键条目。

连接被重用。

我该如何解决这个问题?在 TableA 上执行 SELECT WITH (NOLOCK) 确实会显示新插入的父记录,但下面的子记录插入看不到它。

编辑澄清:在foreach 循环中,我已经插入但未提交的新ParentID。 问题是插入子表 B 失败,因为父表 A 的表 B 中的 FK 看不到未提交的新表 A PK ID。

【问题讨论】:

    标签: c# transactionscope referential-integrity


    【解决方案1】:

    附注 - 您必须使用 TransactionScope.Complete 实例方法显式完成事务,否则它会回滚。

    【讨论】:

    • 我确实在伪代码中忽略了它。为您的观赏乐趣而固定。
    • 这没有提供预期的解决方案.. 这不应该是公认的答案
    【解决方案2】:

    如果您有一个标识列,您可以尝试在 INSERT 语句中使用OUTPUT INSERTED 子句。

    这里是 a good article 关于这个主题的。

    【讨论】:

    • 请检查我的编辑以澄清问题。您建议的解决方案不是我遇到的问题:当子插入失败时,我已经有了 newParentID。
    猜你喜欢
    • 2010-12-06
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多