2011-08-24 84 views
0

我有以下兩個表LINQ to SQL多個提交,我應該如何實現事務?

表1: PK(INT) TOTALCOUNT(INT)

表2: PK(INT) FK(INT)(與PK表1中的關係) 計數

我在第一個表中插入一條記錄,以獲得一個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) 
    } 

} 

我很快就寫了這個代碼,所以如果有邏輯錯誤,請忽略。

那麼交易會幫助我做我想做的事嗎?

+2

你應該可以把它包裝在一個TransactionScope中。 –

+0

看看http://msdn.microsoft.com/en-us/library/bb738523.aspx,關於如何使用它(TransactionScope)有一個非常有用的例子, – a1ex07

回答

3

通常你應該有數據2導航屬性,你可以設置爲您的數據1實例:

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上下文=新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失敗,交易將自動rolledback。

相關問題