2010-10-23 63 views
3
 public void SomeMethod1() 
     { 
      using (TemplateEntities ctx = new TemplateEntities()) 
      { 
       //do something in this ctx 
      } 
     } 

     public void SomeMethod2() 
     { 
      using (TemplateEntities ctx = new TemplateEntities()) 
      { 
       //do something else in this ctx 
      } 
     } 

     public void SomeMethod() 
     { 
      using (TemplateEntities ctx = new TemplateEntities()) 
      { 
       using (TransactionScope tran = new TransactionScope()) 
       { 
        SomeMethod1(); 
        SomeMethod2(); 
        var itemToDelete= (from x in ctx.Xxx 
            where x.Id==1 
            select x).Single(); 
        ctx.Xxx.DeleteObject(itemToDelete); 
        ctx.SaveChanges(); 
        tran.Complete(); 
       } 
      } 
     } 

即使有更多的上下文,SomeMethod中會發生什麼? 我正在使用POCO。關於實體框架和事務的問題

回答

0

如果使用具有多個ObjectContext實例的TransactionScope,事務將被提升爲分佈式,並且整個操作(SomeMethod)仍將作爲原子處理。但分佈式事務需要額外的NT服務及其依賴。該服務稱爲Microsoft分佈式事務處理協調器(MSDTC)。此服務必須在所有涉及的服務器(應用程序服務器和數據庫服務器)上運行。在網絡場景服務中需要一些額外的配置。對於通信RPC端口必須在防火牆中打開。

+0

但是,如果我們正在談論與一個數據庫表是正確的我的例子? – gigi 2010-10-23 20:58:12

+0

不,它仍然需要MSDTC。但是,當您管理自己的連接時,這不會成爲問題。有關更多信息,請參見http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/189b2718-c2b0-4290-8517-3cd3da4314fc。 – 2010-10-23 21:45:43

0

最終,數據庫並不知道數據上下文,因此簡單地說:應用交易規則。作爲一個可序列化的事務,諸如讀鎖和鍵範圍鎖之類的東西將被頒發和兌現。與往常一樣,存在死鎖複雜化的風險,但最終應該起作用。請注意,所有涉及的上下文應根據需要徵用。