0

在没有添加特殊设置的情况下,在最后单个 submitchanges() 的情况下 linq to sql datacontext 的行为如何?我的数据库在 mssql 服务器上

我对交易的确切开始时间感到困惑。考虑以下伪 EXAGGERATED 代码:

DataContext dc= new DataContext();
Thread.Sleep(10 min);
var rs = from a in dc.myTable Where.. select r;
.............
.............
.............
use rs //but do nothing to edit myTable.May be loop over it(?) to force execution
.............
.............
Thread.Sleep(10 min);
//read again, same criteria as before
rs = from a in dc.myTable Where.. select r;
.............
.............

dc.SubmitChanges()
  1. 如果我没有在任何地方明确更改任何设置,无论是代码还是 db. 即使其他人在表中插入(并提交)符合我的选择标准的新行,我的 rs 第二次会返回相同的结果吗?
  2. linq 的隐式事务何时/何时开始?就在实例化 DataContext 的时候?或者取决于我们对 DataContext 做什么(或不做什么),当 dc.SubmitChanges() 被调用时?
4

1 回答 1

0
  1. 当您没有在特定隔离级别显式启动事务时,您的读取发生在事务之外并以默认隔离级别运行,我认为这是已提交读。如果在执行两个查询之间,其他用户插入了与您的条件匹配的其他记录,它们将显示在第二个查询的结果中。
  2. 隐式事务在实际数据提交到数据库之前启动并在之后立即提交。如果您SubmitChanges多次调用,每次调用都会有一个事务。

关于第一个问题:如果您确实在事务中运行查询,请注意您使用的隔离级别,以及如何设置表的锁定升级策略。默认情况下,如果您使用using (var scope = new TransactionScope()),您的第一个查询将导致表被锁定。其他希望插入记录的用户最终会等待一段时间,并且由于超时而拒绝他们的操作。在此处阅读有关隔离级别的更多信息。

于 2013-02-01T10:41:12.967 回答