自定义事务隔离级别

Microsoft SQL Server 数据库引擎的默认隔离级别为 READ COMMITTED。如果应用程序必须在其他隔离级别运行,则它可以使用以下方法设置隔离级别:

  • 运行 SET TRANSACTION ISOLATION LEVEL 语句。

  • 使用 System.Data.SqlClient 托管命名空间的 ADO.NET 应用程序可以使用 SqlConnection.BeginTransaction 方法指定 IsolationLevel 选项。

  • 使用了 ADO 的应用程序可以设置 Autocommit Isolation Levels 属性。

  • 启动事务时,使用 OLE DB 的应用程序可以调用 ITransactionLocal::StartTransaction,并在调用时将 isoLevel 设置为所需的事务隔离级别。在自动提交模式下指定隔离级别时,使用 OLE DB 的应用程序可以将 DBPROPSET_SESSION 属性 DBPROP_SESS_AUTOCOMMITISOLEVELS 设置为所需的事务隔离级别。

  • 使用 ODBC 的应用程序可以使用 SQLSetConnectAttr 设置 SQL_COPT_SS_TXN_ISOLATION 属性。

有关设置事务隔离级别的详细信息,请参阅调整事务隔离级别

指定隔离级别后,SQL Server 会话中的所有查询语句和数据操作语言 (DML) 语句的锁定行为都将在该隔离级别进行操作。隔离级别将在会话终止或将其设置为其他级别后失效。

下面的示例设置 SERIALIZABLE 隔离级别:

USE AdventureWorks2008R2;
GO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
GO
BEGIN TRANSACTION;
SELECT BusinessEntityID
    FROM HumanResources.Employee;
GO

必要时,可以通过指定表级提示来替代各个查询语句或 DML 语句的隔离级别。指定表级提示不会影响会话中的其他语句。建议仅在确实必要时才使用表级提示更改默认行为。

读取元数据时,甚至当隔离级别被设置为在读取数据时不请求共享锁的级别时,数据库引擎也可能需要获取锁。例如,在未提交读隔离级别下运行的事务在读取数据时将不获取共享锁,但是在读取系统目录视图时可能会请求锁。这意味着在查询表时如果某个并发事务正在修改该表的元数据,则未提交读事务可能会导致阻塞。

若要确定当前设置的事务隔离级别,请使用 DBCC USEROPTIONS 语句,如下面的示例所示。该结果集可能与系统的结果集不同。

USE AdventureWorks2008R2;
GO
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
GO
DBCC USEROPTIONS;
GO

下面是结果集:

Set Option                   Value

---------------------------- -------------------------------------------

textsize                     2147483647

language                     us_english

dateformat                   mdy

datefirst                    7

... ...

Isolation level repeatable read

(14 row(s) affected)

DBCC 执行完毕。如果 DBCC 输出了错误消息,请与系统管理员联系。