1

这是一个使用 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()”时

这篇文章指出 SQL CE 不支持一个事务中的两个连接,但我这里只有一个(除非 SubmitChanges() 创建另一个)。

上面的想法是,如果子事务提交,那么即使外部事务失败,它也会保持提交。据我了解,这是RequiresNew 的预期用途

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

编辑:虽然这篇 MSDN 文章与其他 MSDN 文章相矛盾,并说不支持嵌套事务。也许这就是问题所在?

4

3 回答 3

3

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

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

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

于 2009-11-26T01:33:56.590 回答
3

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

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

于 2009-11-26T01:40:27.017 回答
0

可能的解决方案:http: //fknet.wordpress.com/2011/02/25/entity-framework-problemsolution-of-default-connection-closing/

于 2011-02-25T23:11:46.783 回答