首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以为特定事务覆盖ReadCommittedSnapshot隔离级别和ReadCommitted隔离级别?

是否可以为特定事务覆盖ReadCommittedSnapshot隔离级别和ReadCommitted隔离级别?
EN

Database Administration用户
提问于 2019-02-13 06:58:17
回答 2查看 760关注 0票数 3

我的数据库的默认隔离级别是“读取提交的快照”。请看下面的截图。

我在我的数据库中有一张表“票证”,上面有以下数据。

现在,在连接1中,我将启动一个具有隔离级别的新事务,名为"read“。我将把#TicketID "2“的优先级更新为”medium“

从连接2,我试图访问#TicketID "2“的详细信息。它仍然从版本存储中获取值,版本存储是由read提交的快照隔离创建的,这不是预期的行为。

根据文档,如果使用“读取提交”隔离级别的事务,在事务执行commit/Rollback之前,任何其他事务都无法访问该行。

有人能告诉我为什么在给定的情况下没有发生这种情况吗?我还想知道,为什么事务级隔离不能覆盖在数据库级别上设置的默认隔离级别(此处是读取提交快照)?

为了更清楚地说明事务范围上的隔离覆盖,我提供以下信息。

我已经将我的数据库隔离设置为读提交。

现在,在连接1,我正在启动我的交易,以更新票的优先权。

在连接2中,我试图访问记录。但这不会完成,因为事务隔离级别处于“读取提交”模式。

在连接3中,我试图以“读取未提交”的形式访问具有隔离级别的记录。在这里,我们可以看到记录,因为它将覆盖在数据库级别上设置的默认隔离。

当我在数据库级别上设置“快照隔离”并在另一个事务范围中覆盖它时,我期待同样的行为。对我来说,它总是从版本存储中返回最后提交的值,而不管事务范围中提到的隔离级别如何。我希望我能清楚地表达我的担忧。:)

EN

回答 2

Database Administration用户

回答已采纳

发布于 2019-02-13 12:13:28

无法覆盖整个事务的读取提交快照(RCSI)的数据库级设置。

当设置RCSI时,所有读取提交的事务都将使用行版本,交付最后提交的行版本。

已请求设置会话级覆盖选项。您可以在添加SET TRANSACTION ISOLATION LEVEL READ COMMITTED LOCK的产品反馈站点上投票支持它。

您可以使用READCOMMITTEDLOCK表提示覆盖每个语句和每个表的设置。

或者,您可以使用快照隔离(SI)和关闭读提交快照隔离(RCSI)。然后,每个事务要么是SET TRANSACTION ISOLATION SNAPSHOT,要么是SET TRANSACTION ISOLATION LEVEL READ COMMITTED

我的系列文章中有关隔离级别的更多信息。

票数 5
EN

Database Administration用户

发布于 2019-02-13 07:30:26

读提交是您的隔离级别。然后,您可以在数据库级别上使用一个旋钮来决定如何实现这个隔离级别。如果您想要阻塞行为,那么只需相应地配置数据库(为您的数据库设置read提交快照)。

如果您希望在更高粒度的情况下对此隔离级别有不同的要求,那么您必须在查询级别上进行qo,并使用READCOMMITTEDLOCK表提示,在这里描述:https://learn.microsoft.com/en-us/sql/t-sql/queries/hints-transact-sql-table?view=sql-server-2017

当然,您可以选择一些不同的隔离级别,其中读取提交快照的数据库设置没有什么不同。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/229582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档