C# LINQ到SQL组合读未提交和读已提交

C# LINQ到SQL组合读未提交和读已提交,c#,linq-to-sql,transactions,C#,Linq To Sql,Transactions,我想使用LINQtoSQL作为应用程序的数据层。乐观并发似乎是可行的,但我希望过于乐观,在进入SubmitChanges()之前不要为任何锁定(例如ReadUncommitteda.k.a.使用(NOLOCK))而烦恼,在这一点上我认为可以使用ReadCommitted 这听起来像疯了吗?使用两个不相交的TransactionScope对象是否更好(一个用于使用ReadUncommitted进行读取,另一个用于使用ReadCommitted提交更改),或者,在提交更改之前,是否有更好的方法可以立

我想使用LINQtoSQL作为应用程序的数据层。乐观并发似乎是可行的,但我希望过于乐观,在进入
SubmitChanges()
之前不要为任何锁定(例如
ReadUncommitted
a.k.a.
使用(NOLOCK)
)而烦恼,在这一点上我认为可以使用
ReadCommitted


这听起来像疯了吗?使用两个不相交的
TransactionScope
对象是否更好(一个用于使用
ReadUncommitted
进行读取,另一个用于使用
ReadCommitted
提交更改),或者,在提交更改之前,是否有更好的方法可以立即提高隔离级别?

ReadCommitted
ReadUncommitted
SubmitChanges()
不重要,因为它是写操作,而不是读操作。无论隔离级别如何,更新都会获取锁并尊重现有锁。它必须,这是锁的主要用途


当然,通过更新未提交的数据,您可能会面临这样的风险,即该记录甚至不存在待更新的记录,但这是您在决定乐观时所接受的风险。

如果您正在阅读,为什么要在事务范围内这样做呢。事务性选择没有意义。这不是真的。通过读取未提交的数据,数据可能稍后回滚,因此用户正在更新ghost。通过不对数据保持读锁定,另一个用户有可能更新该数据,而该更新将盲目覆盖该数据。我不同意这种说法。使用readuncommitted选项的事务性读取将允许我立即(更快)访问可能被其他进程锁定的行。@DevDelivery-我不知道(使用LINQ to SQL内置的乐观并发检查)进程会盲目覆盖其他进程的数据。我将其视为第一个更新wins场景,在该场景中,后续更新尝试失败,出现ChangeConflictException。如果一个进程正在更新一个ghost,它仍然需要在保存更新之前释放ghost的锁…@Jono-I指出事务性选择是有价值的。是的,并发性检查可以避免这种情况,但您必须全部设置—指定要检查哪些列的并发性,然后捕获任何异常。我不确定这是真的。LINQ to SQL需要在提交更改之前检查ROWVERSION字段以检查乐观并发冲突。我担心的是,它可能会在并发检查中继续使用我事务的ReadUncommitted隔离级别。事务隔离级别与并发检查无关。我猜您认为并发检查首先执行读取以检查并发性,如果可以,则执行更新。然而,并发检查内置于update语句本身,正如我在回答中指出的,update总是尊重锁。我想我可以查看日志输出来验证它是否只是一个单独的更新,您指出的是正确的,它总是会打开锁。如果是这样的话,那么我可以用一个TransactionScope在上下文中构建实体…谢谢,看起来你是对的。UPDATE语句本身就是并发检查:它使用WHERE子句中的ROWVERSION字段。