Azure SQL - 使用 ADO.NET 时的默认隔离级别

msl*_*lot 1 ado.net azure azure-sql-database

在 Azure SQL 中,默认隔离级别是 RCSI。我理解这种行为。据我了解,对我来说,在通过简单的 ADO.NET SqlConnection 选择数据时需要使用已提交读。我很难理解在进行简单选择时是否应用行版本控制。使用 SqlConnection 时应用的默认隔离级别是什么?

从这里编辑: https://learn.microsoft.com/en-us/dotnet/framework/data/adonet/sql/snapshot-isolation-in-sql-server#snapshot-isolation-level-extensions

我读

READ_COMMITTED_SNAPSHOT 数据库选项确定在数据库中启用快照隔离时默认 READ COMMITTED 隔离级别的行为。如果未显式指定 READ_COMMITTED_SNAPSHOT ON,则 READ COMMITTED 将应用于所有隐式事务。这会产生与设置 READ_COMMITTED_SNAPSHOT OFF(默认值)相同的行为。当 READ_COMMITTED_SNAPSHOT OFF 生效时,数据库引擎使用共享锁来强制执行默认隔离级别。如果将 READ_COMMITTED_SNAPSHOT 数据库选项设置为 ON,则数据库引擎默认使用行版本控制和快照隔离,而不是使用锁来保护数据。

这是否意味着数据库只是将所有默认事务升级到 RCSI,因此如果未指定特定事务级别,它将行版本控制应用于所有内容?所以SqlConnection只是默认为RCSI而不是默认的读已提交。

Alb*_*llo 5

Azure SQL 数据库默认数据库范围设置是通过将 READ_COMMITTED_SNAPSHOT 和 ALLOW_SNAPSHOT_ISOLATION 数据库选项设置为 ON 来启用读已提交快照隔离 (RCSI)。您无法更改数据库默认隔离级别。但是,您可以显式控制连接上的隔离级别。执行此操作的一种方法是,在开始事务之前,可以在 Azure SQL 数据库中使用以下任一语句:

\n\n
SET TRANSACTION  ISOLATION LEVEL  SERIALIZABLE\nSET TRANSACTION  ISOLATION LEVEL  SNAPSHOT\nSET TRANSACTION  ISOLATION LEVEL  REPEATABLE READ\nSET TRANSACTION  ISOLATION LEVEL  READ COMMITTED\nSET TRANSACTION  ISOLATION LEVEL  READ UNCOMMITTED\n
Run Code Online (Sandbox Code Playgroud)\n\n

SET TRANSACTON ISOLATION LEVEL 控制由 SQL Server 连接发出的 Transact-SQL 语句的锁定和行版本控制行为,并跨批(GO 语句)。以上所有的工作方式与 SQL Server 完全相同。

\n\n

另外,上述语句“SET TRANSACTION ISOLATION LEVEL READ COMMITTED”会将隔离级别设置为读已提交快照隔离(RCSI)。此隔离级别不同于已提交读 (RC)。换句话说,本地 SQL Server 中 \xe2\x80\x9cSET TRANSACTION ISOLATION LEVEL READ COMMITTED 的默认行为是 RC,但在 Azure SQL 数据库中是 RCSI。如果您想在Azure SQL 数据库,您必须为 SQL 语句设置锁定提示READCOMMITTEDLOCK。

\n