自定义事务隔离级别

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

  • 运行 SET TRANSACTION ISOLATION LEVEL 语句。
  • 使用 System.Data.SqlClient 托管命名空间的 ADO.NET 应用程序可以使用 SqlConnection.BeginTransaction 方法指定 IsolationLevel 选项。
  • 使用了 ADO 的应用程序可以设置自动提交隔离级别属性。
  • 启动事务时,使用 OLE DB 的应用程序可以调用 ITransactionLocal::StartTransaction,并在调用时将 isoLevel 设置为所需的事务隔离级别。在自动提交模式下指定隔离级别时,使用 OLE DB 的应用程序可以将 DBPROPSET_SESSION 属性 DBPROP_SESS_AUTOCOMMITISOLEVELS 设置为所需的事务隔离级别。
  • 使用 ODBC 的应用程序可以使用 SQLSetConnectAttr 设置 SQL_COPT_SS_TXN_ISOLATION 属性。

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

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

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

USE AdventureWorks
GO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
GO
BEGIN TRANSACTION;
SELECT EmployeeID
    FROM HumanResources.Employee;
GO

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

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

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

USE AdventureWorks;
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 execution completed. If DBCC printed error messages, contact your system administrator.

请参阅

其他资源

DBCC USEROPTIONS (Transact-SQL)
SET TRANSACTION ISOLATION LEVEL (Transact-SQL)
SELECT (Transact-SQL)

帮助和信息

获取 SQL Server 2005 帮助