【问题标题】:LINQ to SQL multiple commits, how should I implement transactions?LINQ to SQL 多次提交,我应该如何实现事务?
【发布时间】:2011-08-24 19:20:10
【问题描述】:

我有以下两张表

表 1: PK(整数) 总数(整数)

表 2: PK(整数) FK (int)(与表1中PK的关系) 数

我在第一个表中插入一条记录,以获得 PK。然后,当我从某个源获取数据并将其转储到表 2 中时,我将使用上一个表中的 PK 填充 FK。

我想在我的代码中实现事务。当插入表 2 失败时,我如何能够回滚表 1,因为表 1 基本上已经发出了提交?

我写了一些代码来帮助说明我在做什么

using (DeviceDataContext context = new DeviceDataContext())
{
     tgdd = new Data();
     context.Datas.InsertOnSubmit(tgdd);
     context.SubmitChanges();

     int pk = tgdd.PK;

     int count = 0;
     foreach (…)
     {
          count += 1;
          tgd = new Data2();
          tgd.FK = pk;
          tgd.count = count;
          context.Datas2.InsertOnSubmit(tgd);  //if this crashes, I want to roll
                                               //back what happened to table 1(Datas)
     }

}

这段代码我写的很快,如有逻辑错误,请忽略。

那么交易会帮助我做我想做的事吗?

【问题讨论】:

标签: c# linq-to-sql transactions


【解决方案1】:

通常,您应该在 Data2 上有一个导航属性,您可以将其设置为 Data1 实例:

 tgdd = new Data();
 context.Datas.InsertOnSubmit(tgdd);

 int count = 0;
 foreach (…)
 {
      count += 1;
      tgd = new Data2();
      tgd.Tgdd = tgdd;
      tgd.count = count;
      context.Datas2.InsertOnSubmit(tgd);  //if this crashes, I want to roll
                                           //back what happened to table 1(Datas)
 }

 context.SubmitChanges();

这样,这不仅可以在单个事务范围内完成,还可以在单​​个数据库往返中完成。

如果您不能使用导航属性来做到这一点,那么使用 TransactionScope 是最好的选择。

【讨论】:

    【解决方案2】:

    将您的“使用 (DeviceDataContext context = new DeviceDataContext())”包装在 TransactionScope 中:

    using (var ts = new TransactionScope())
    using (DeviceDataContext context = new DeviceDataContext())
    {
       tgdd = new Data();
         context.Datas.InsertOnSubmit(tgdd);
         context.SubmitChanges();
    
         int pk = tgdd.PK;
    
         int count = 0;
         foreach (…)
         {
              count += 1;
              tgd = new Data2();
              tgd.FK = pk;
              tgd.count = count;
              context.Datas2.InsertOnSubmit(tgd);  //if this crashes, I want to roll
                                                   //back what happened to table 1(Datas)
         }
       ts.Complete();
    }
    

    如果 InsertOnSubmt 失败,事务会自动回滚。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-25
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 2011-02-22
      • 1970-01-01
      相关资源
      最近更新 更多