是否SQL Server精简(CE)支持内另一个的RequiresNew事务的范围?(Does SQ

2019-10-17 20:40发布

下面是使用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文章,并说嵌套事务不被支持。 也许这是什么问题?

Answer 1:

不,你不能使用嵌套事务。 在你的SQL CE数据库运行这段代码,你会看到错误消息。

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

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



Answer 2:

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

你将不得不调用DataContext.Transaction = DataContext.Connection.BeginTransaction和控制自己的事务。



Answer 3:

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



文章来源: Does SQL Server Compact (CE) support a RequiresNew transaction scope inside another one?