问候Snapshot事务是否会失败,并且只能在TransactionScope中部分提交?
今天对我来说似乎有点不可能,我偶然到一个问题,但它的发生......我打电话给在C#中的一些数据库的代码看起来是这样的:
using(var tran = MyDataLayer.Transaction())
{
MyDataLayer.ExecSproc(new SprocTheFirst(arg1, arg2));
MyDataLayer.CallSomethingThatEventuallyDoesLinqToSql(arg1, argEtc);
tran.Commit();
}
我已经简化了这一点发布,但是发生了什么是MyDataLayer.Transaction()使IsolationLevel设置为快照和TransactionScopeOption设置为必需的TransactionScope。这段代码每天被调用数百次,并且几乎总能完美运行。然而,在查看一些数据后,我发现有一些由“SprocTheFirst”创建的记录,但没有来自“CallSomethingThatEventuallyDoesLinqToSql”的相应数据。记录应该存在于我看到的表中的唯一方法是从SprocTheFirst,并且它唯一的一次调用这个函数,所以如果它的调用和成功,那么我会期待CallSomethingThatEventuallyDoesLinqToSql将被调用并成功,因为它的全部在同样的TransactionScope。理论上可能有其他一些开发人员在数据库中徘徊,但我认为他们没有。我们还记录了所有的例外情况,并且在创建SprocTheFirst记录的时候没有发现任何异常情况。
那么,是否有可能事务或更正确地声明式TransactionScope与快照隔离级别可能以某种方式失败,只有部分提交?
是否是TransactionScope?它不应该是'tran.Complete();'? – 2010-05-29 03:17:21