SQL Server Compact(CE)是否支持另一个内部的RequiresNew事务范围?

时间:2009-10-12 13:05:17

标签: linq-to-sql sql-server-ce transactionscope

这是一个使用SQL Server CE 3.5 SP1的非常简单的示例,我尝试在现有事务中使用新事务。

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()”

This article表示SQL CE在一个事务中不支持两个连接,但我在这里只有一个(除非SubmitChanges()创建另一个)。

上面的想法是,如果子事务提交,那么即使外部事务失败也会保持提交。据我所知,这是the intended use of RequiresNew

This MSDN article声称SQL CE支持嵌套事务,因此我认为上述应该是可能的。是吗?如果是这样,我如何修改代码才能使其工作?

编辑:虽然this MSDN article与其他MSDN文章相矛盾,但表示不支持嵌套事务。也许这就是问题?

3 个答案:

答案 0 :(得分:3)

不,您不能使用嵌套事务。在SQL CE数据库上运行此代码,您将看到错误消息。

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

主要错误0x80004005,次要错误27994 Microsoft SQL Server Compact不支持嵌套事务。

答案 1 :(得分:3)

在您的情况下,您不应使用TransactionScope。

您必须调用DataContext.Transaction = DataContext.Connection.BeginTransaction并控制您自己的事务。

答案 2 :(得分:0)