调整事务隔离级别

隔离属性是原子性、一致性、隔离性和持久性 (ACID) 这四个属性之一,逻辑工作单元必须具备这四个属性才能称为事务。隔离属性能够使事务免受其他并发事务执行的更新的影响。每个事务的隔离级别实际上都是可以自定义的。

SQL Server 数据库引擎支持 SQL-92 中定义的事务隔离级别。设置事务隔离级别使程序员面临的风险因某些完整性问题而增加,但好处是可以支持更好的数据并发访问。事务隔离级别有:

  • READ UNCOMMITTED

  • READ COMMITTED

  • REPEATABLE READ

  • SNAPSHOT

  • SERIALIZABLE

通过将更严格的锁持有更长时间,每个隔离级别都比上一个级别提供更好的隔离性,但有两个例外。这两个例外是将 READ_COMMITTED_SNAPSHOT 设置为 ON 时的 SNAPSHOT 和 READ COMMITTED。这两个隔离级别在读取操作期间并不获取数据行的共享锁。只在表级持有 SCH-S 锁。

可以使用 Transact-SQL 或通过数据库 API 来设置事务隔离级别。

  • Transact-SQL
    Transact-SQL 脚本使用 SET TRANSACTION ISOLATION LEVEL 语句。

  • ADO
    ADO 应用程序将 Connection 对象的 IsolationLevel 属性设置为 adXactReadUncommitted、adXactReadCommitted、adXactRepeatableRead 或 adXactReadSerializable。

  • ADO.NET
    使用 System.Data.SqlClient 托管命名空间的 ADO.NET 应用程序可以调用 SqlConnection.BeginTransaction 方法并将 IsolationLevel 选项设置为 Unspecified、Chaos、ReadUncommitted、ReadCommitted、RepeatableRead、Serializable 或 Snapshot。

  • OLE DB
    开始事务时,使用 OLE DB 的应用程序调用 ITransactionLocal::StartTransaction,其中 isoLevel 设置为 ISOLATIONLEVEL_READUNCOMMITTED、ISOLATIONLEVEL_READCOMMITTED、ISOLATIONLEVEL_REPEATABLEREAD、ISOLATIONLEVEL_SNAPSHOT 或 ISOLATIONLEVEL_SERIALIZABLE。

    在自动提交模式下指定事务隔离级别时,OLE DB 应用程序可以将 DBPROPSET_SESSION 属性 DBPROP_SESS_AUTOCOMMITISOLEVELS 设置为 DBPROPVAL_TI_CHAOS、DBPROPVAL_TI_READUNCOMMITTED、DBPROPVAL_TI_BROWSE、DBPROPVAL_TI_CURSORSTABILITY、DBPROPVAL_TI_READCOMMITTED、DBPROPVAL_TI_REPEATABLEREAD、DBPROPVAL_TI_SERIALIZABLE、DBPROPVAL_TI_ISOLATED 或 DBPROPVAL_TI_SNAPSHOT。

  • ODBC
    ODBC 应用程序调用 SQLSetConnectAttr,其中 Attribute 设置为 SQL_ATTR_TXN_ISOLATION,ValuePtr 设置为 SQL_TXN_READ_UNCOMMITTED、SQL_TXN_READ_COMMITTED、SQL_TXN_REPEATABLE_READ 或 SQL_TXN_SERIALIZABLE。

    对于快照事务,应用程序调用 SQLSetConnectAttr,其中 Attribute 设置为 SQL_COPT_SS_TXN_ISOLATION,ValuePtr 设置为 SQL_TXN_SS_SNAPSHOT。可以使用 SQL_COPT_SS_TXN_ISOLATION 或 SQL_ATTR_TXN_ISOLATION 检索快照事务。