【发布时间】:2015-12-07 00:17:49
【问题描述】:
看起来 SqlDataReader 实际上会一次抓取多行
我有一种情况,我需要一次抓取一行。 在 SqlDataReader 循环中,我可以使用单独的 SQL 命令更改、插入或删除行。 我遇到的问题是,可能是 SqlDataReader 预取的数据发生了变化,所以我得到了陈旧的数据。 我真的不需要查看循环中执行的插入,但如果我阅读它们,它不会破坏任何东西。
如何让 SqlDataReader.Read() 从数据库中一次实际读取一行?
【问题讨论】:
-
DataReader 的设计初衷不是为了完成您正在做的事情。它旨在避免一次将所有数据通过管道传输,从而提高效率。您将不得不重新考虑您的设计。
-
您看到的是事务如何工作的效果。数据的检索是在事务范围内完成的,这意味着您可以在事务期间看到一致的数据视图。想象一下,在银行场景中,您将资金从一个账户转移到另一个账户。如果您在借记后阅读第一个帐户,而在贷记之前阅读第二个帐户,则看起来您没有钱。你可能不会很喜欢那样。您也许可以调整隔离级别,以便允许脏/幻读。
-
@BLam 错了,这完全是交易的事情。也许一些基础教育是必要的 - 阅读 ACID 并阅读 cobbs 的关系定理。您违反了 A 和 I - SQL 事务支柱中的两个。
-
@Blam 绝对存在 ACID ciolation,除非您在一个连接上使用 MARS 或人为地将多个连接合并到一个事务 - 否则 I 部分会出现,并且设计真的很奇怪。
-
正如 TomTom 所说,您是不正确的。数据库中的每个操作都是在事务的上下文中执行的,无论是显式的还是隐式的。事务不一定会阻塞其他操作,它只是确保您的数据库视图在操作期间保持一致。
标签: .net sqldatareader