2009-10-12 36 views
1

下面是一個使用SQL Server CE 3.5 SP1的簡單示例,我嘗試在現有的事務中使用新的事務。SQL Server Compact(CE)是否支持另一個RequiresNew事務作用域?

using (var db = new MyDataContext(<connection string>)) 
using (var ts = new TransactionScope()) 
{ 
    db.Thing.InsertOnSubmit(new Thing()); 
    db.SubmitChanges(); 
    using (var ts2 = new TransactionScope(TransactionScopeOption.RequiresNew)) 
    { 
     db.Thing.InsertOnSubmit(new Thing()); 
     db.SubmitChanges(); // exception here 
     ts2.Complete(); 
    } 
    [... do more stuff ...] 
    ts.Complete(); 
} 

這會導致錯誤「連接對象不能在事務範圍內註冊」。在第二次調用「db.SubmitChanges()」

指出SQL CE不支持一個事務內的兩個連接,但我只有一個在這裏(除非SubmitChanges()創建另一個連接)。

上面的想法是,如果子事務提交,那麼即使外部事務失敗,它仍然保持提交。據我所知,這是the intended use of RequiresNew

This MSDN article聲稱SQL CE支持嵌套事務,因此我認爲上述應該是可能的。是嗎?如果是這樣,我該如何修改代碼才能使其工作?

編輯:雖然this MSDN article與另一個MSDN文章相矛盾,並且說嵌套事務不受支持。也許這就是問題所在?

回答

3

不,你不能使用嵌套事務。在SQL CE數據庫上運行此代碼,您將看到錯誤消息。

BEGIN TRANSACTION; 
SELECT 'GOT 1'; 
BEGIN TRANSACTION; 
SELECT 'GOT 2'; 

主要錯誤0x80004005,次要錯誤27994 微軟的SQL Server Compact不支持嵌套事務。

3

就你而言,你不應該使用TransactionScope。您將不得不調用DataContext.Transaction = DataContext.Connection.BeginTransaction並控制您自己的事務。

相關問題