具有快照隔离的事务会导致结果不一致

时间:2016-10-25 19:13:10

标签: c# sql sql-server entity-framework transaction-isolation

环境:SQL Server 2012

后端:C#+ EntityFramework

我们使用更改跟踪从多个表中获取更改。所有操作都在一个具有快照隔离级别的事务内完成。该事务中的所有查询都是只读的。

using (var context = new BackendContext())
                {
                    using (var transaction = context.Database.BeginTransaction(IsolationLevel.Snapshot))
                    {
                        try
                        {
                            int count1= context.Reservation.Count();

                            //Then several read only operations to get changes from Chnage Tracking
                            ...

                            int count2= context.Reservation.Count();

                            if(count1 != count2)
                            {
                                throw new Exception("Inconsistent state");
                            }

                            transaction.Commit();
                        }
                        catch (Exception)
                        {
                            transaction.Rollback();
                            throw;
                        }
                    }
                }

所以第一个奇怪的事情是,如果我们在处理更改之前计算表中的行数,那么有时我们会得到不同的结果。根据MSDN:SNAPSHOT隔离指定在事务中读取的数据永远不会反映其他同时事务所做的更改。但是在一个带有快照的交易中我们得到了两个不同的结果。

另一个主要问题与我刚才描述的问题一起发生。

在该事务中,我们从多个表中获取更改。

假设我们有Table1,Table2和Junction表,我们有一对多的关系,所以T1行可能有多个T2关系。

有时我们没有从Table1获得更改,但我们确实从Table2进行了更改,其中的条目链接到Table1。 同样,一切都发生在具有快照隔离的一个事务中。

我希望我很清楚。

0 个答案:

没有答案