2009-10-12 38 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并控制您自己的事务。

相关问题