如何回滚与LINQ to SQL相关的事务?

gre*_*man 5 c# database transactions linq-to-sql

问题只是回滚变化,而不是提交.

假设我获取了一些数据,我更改了它们,我提交了更改(可选步骤)并且我回滚了事务.无论你在哪里看到每个作者写的内容,都会取消这些更改.

但我发现这是半真的 - LINQ DataContext将保留更改的数据!我使用TransactionScope和DataContext.Transaction测试了这个.在这两种情况下,我都有相同的行为.

解决方法是在回滚后重新创建DataContext(但这会导致其他问题,如缓存数据和处理嵌套事务)或手动丢弃DataContext中的更改.然而,这些只是解决方法.

问题

那我错过了什么?LINQ to SQL不适合交易吗?如何使用事务,以便他们真的回滚更改?

                MyTable record = null;

                db.Connection.Open();
                using (db.Transaction = db.Connection.BeginTransaction())
                {
                        record = db.MyTable.First();
                        record.BoolField = !record.BoolField; // changed
                        db.SubmitChanges();
                        db.Transaction.Rollback();
                }
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 4

数据上下文应被视为一个工作单元。其粒度取决于您 - 它可以是页面请求,也可以是单个操作;但是 - 如果你遇到异常(或几乎任何意外情况) -停止;放弃数据上下文并回滚。回滚后,您的数据上下文将会变得混乱,所以不要保留它

此外; 不要将数据上下文保留的时间超过必要的时间。它并非旨在用作应用程序长的数据缓存。