【发布时间】:2011-09-08 11:08:22
【问题描述】:
我想使用 LINQ to SQL 作为应用程序的数据层。乐观并发似乎可以工作,但我想过于乐观并且不打扰任何锁定(例如ReadUncommitted 又名WITH (NOLOCK)),直到我到达SubmitChanges(),此时我认为可以使用ReadCommitted。
这听起来很疯狂吗?最好使用两个分离的TransactionScope 对象(一个用于读取ReadUncommitted,然后第二个用于使用ReadCommitted 提交更改),还是有更好的方法可以在提交更改之前立即提高隔离级别?
【问题讨论】:
-
如果您正在阅读为什么要在事务范围内执行此操作。事务选择是没有意义的。
-
这不是真的。通过读取未提交的数据,有可能数据后来被回滚,因此用户正在更新幽灵。并且通过不对数据保持读锁定,其他用户可能会更新此更新将盲目覆盖的数据。
-
我不同意。带有 readuncommitted 选项的事务性读取将允许我立即(更快)访问可能被其他进程锁定的行。
-
@DevDelivery - 我不知道(使用 LINQ to SQL 的内置乐观并发检查)进程可能会盲目地覆盖另一个数据的情况。我将其视为第一次更新获胜的场景,后来的更新尝试因 ChangeConflictExceptions 而失败。如果一个进程正在更新一个ghost,它仍然需要在保存更新之前释放ghost的锁......
-
@Jono - 我指出事务选择具有价值。是的,并发检查可以避免这种情况,但您必须全部设置 - 指定要检查并发的列然后捕获任何异常。
标签: c# linq-to-sql transactions