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

标签 azure ado.net 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

我读过

The READ_COMMITTED_SNAPSHOT database option determines the behavior of the default READ COMMITTED isolation level when snapshot isolation is enabled in a database. If you do not explicitly specify READ_COMMITTED_SNAPSHOT ON, READ COMMITTED is applied to all implicit transactions. This produces the same behavior as setting READ_COMMITTED_SNAPSHOT OFF (the default). When READ_COMMITTED_SNAPSHOT OFF is in effect, the Database Engine uses shared locks to enforce the default isolation level. If you set the READ_COMMITTED_SNAPSHOT database option to ON, the database engine uses row versioning and snapshot isolation as the default, instead of using locks to protect the data.

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

最佳答案

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

SET TRANSACTION  ISOLATION LEVEL  SERIALIZABLE
SET TRANSACTION  ISOLATION LEVEL  SNAPSHOT
SET TRANSACTION  ISOLATION LEVEL  REPEATABLE READ
SET TRANSACTION  ISOLATION LEVEL  READ COMMITTED
SET TRANSACTION  ISOLATION LEVEL  READ UNCOMMITTED

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

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

关于Azure SQL - 使用 ADO.NET 时的默认隔离级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57545871/

相关文章:

azure - 'make' KDIR=/lib/modules/5.15.0-1023-azure/build....(错误退出状态 : 2)

entity-framework - Entity Framework 4还是数据集?

c# - 如何将 NULL 值插入数据库

c# - 将字节数组从 Oracle RAW 转换为 System.Guid?

azure-sql-database - 如何使Dapper对SqlAzure具有弹性?

azure - 无法将azure sql db连接为VS中CDC控制任务中的连接管理器

c# - Azure Function Http Trigger 验证正文数据

java - 使用 MSI 通过 AAD 访问 Azure Web 应用程序 Web 服务

sql-server - 无法在 Azure SQL 数据库 V12 上启用全文搜索

java - 如何使用 jTDS 连接到 Azure SQL 数据库