我的数据库的默认隔离级别是“读提交快照”。请看下面的截图。
我的数据库中有包含以下数据的表“Tickets”。
现在在连接 1 中,我开始一个隔离级别为“已提交读取”的新事务。我要将#TicketID“2”的优先级更新为“中”
从连接 2,我试图访问#TicketID“2”的详细信息。并且它仍然从由读取提交快照隔离创建的版本存储中获取值,这不是预期的行为。
根据文档,如果事务使用“已提交读取”隔离级别,则在事务执行提交/回滚之前,任何其他事务都无法访问该行。
谁能告诉我为什么在给定的情况下没有发生这种情况?我也很想知道,为什么事务级别的隔离不能覆盖在数据库级别设置的默认隔离级别(此处为读取提交的快照)?
为了更清楚地说明事务范围的隔离覆盖,我提供了以下信息。
我已将我的数据库隔离设置为读取已提交。
现在在连接 1 中,我正在启动我的事务以更新票证优先级。
在连接 2 中,我正在尝试访问记录。但这不会完成,因为事务隔离级别处于“已提交读”模式。
在连接 3 中,我试图访问隔离级别为“读取未提交”的记录。在这里我们可以看到记录,因为它将覆盖在数据库级别设置的默认隔离。
当我在数据库级别设置“快照隔离”并在另一个事务范围内覆盖它时,我期待相同的行为。对我来说,它总是从版本存储中返回最后提交的值,而不管事务范围中提到的隔离级别如何。我希望我清楚地表达了我的担忧.. :)
无法覆盖整个事务的读取提交快照 (RCSI) 的数据库级设置。
设置 RCSI 时,所有读取提交的事务都将使用行版本,交付行的最后提交版本。
已要求会话级覆盖选项。您可以在Add
SET TRANSACTION ISOLATION LEVEL READ COMMITTED LOCK
的产品反馈网站上为它投票。您可以使用表提示覆盖每个语句和每个表的设置。
READCOMMITTEDLOCK
或者,您可以使用快照隔离 (SI) 并关闭读取提交快照隔离 (RCSI)。然后每笔交易要么
SET TRANSACTION ISOLATION SNAPSHOT
要么SET TRANSACTION ISOLATION LEVEL READ COMMITTED
。有关隔离级别的系列文章中的更多信息。
READ COMMITTED是您的隔离级别。然后你可以在数据库级别设置一个旋钮,你可以用它来决定如何实现这个隔离级别。如果您想要阻塞行为,则只需相应地配置数据库(为您的数据库设置读取已提交的快照)。
如果你想在更高的粒度上为这个隔离级别做些不同的事情,那么你必须在查询级别进行 qo 并使用 READCOMMITTEDLOCK 表提示,如下所述:https ://learn.microsoft.com/en-us/sql/t- sql/queries/hints-transact-sql-table?view=sql-server-2017。
而且,您当然可以选择一些不同的隔离级别,其中读取提交快照的数据库设置没有区别。