环境: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链接的条目 . 同样,一切都发生在具有快照隔离的一个事务中 .

我希望我很清楚 .