Grz*_*zak 5 sql-server azure-sql-database isolation-level
我正在运行 SQL Azure,我有以下案例。
我有两个事务W(作者)和R(读者)。两者都使用 RCSI(使用 LTM 的具有 TransactionScopes 的 .net 应用程序)运行。该R交易在同一时间启动W,并继续执行SELECT语句读取由该交易的书面表格W。
通常,事务R在W提交其更改后立即看到所有更改。但是,有时事务会R看到没有事务最近提交的状态W。
问题是:
RCSI 是否保证R始终看到表的最新状态?根据:https :
//docs.microsoft.com/en-us/sql/relational-databases/sql-server-transaction-locking-and-row-versioning-guide?view=
sql-server- 2017读提交应该总是获取在执行SELECT查询时可用的行的最新版本。但是,当有两个独立的会话时,是否可以保证?
已提交读应始终获取执行 SELECT 查询时可用的行的最新修订版。
是的,你是对的。因为它是 RCSI,所以它处于语句级别而不是事务级别,这将是常规快照隔离。
但是,当有两个独立的会话时,是否可以保证?
是的,应该是。
RCSI 是否保证
R始终看到表的最新状态?
是的,从语句开始时起,它将是最新的,并在需要时基于版本存储。这意味着如果读取查询开始并且写入在写入中间,则读取语句将看到较旧的值。
您所描述的情况是正常的,并且符合一个线程上的小而快速的并发更新并在另一个线程上读取。大多数情况下,RCSI 以可能稍微过时的读取为代价来缓解锁定/阻塞。您可以通过在每个语句开始、提交等时检查单个语句级别来找出问题的根源,但是如果它们相隔几毫秒或微秒,那么除了写入之外,您真的没有任何办法可以更改它访问数据的应用程序的线程同步 - 从而强制读取不会过时。
请注意,这假设写入小、快速且成功完成。例如,当通过 RCSI 读取时,应用程序挂起且从不提交的写入将显示以前的值,而不是像在读取提交时那样保持阻塞状态。