sqlserver事务隔离级别

本文深入解析SQLServer中四种事务隔离级别的作用及语法,包括READ COMMITTED、READ UNCOMMITTED、REPEATABLE READ和SERIALIZABLE。同时,探讨了ROWLOCK的使用及其在SQLServer中的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SET TRANSACTION ISOLATION LEVEL (Transact-SQL)
适用于: 是SQL Server 是Azure SQL 数据库 是Azure Synapse Analytics (SQL DW) 是并行数据仓库
控制到 Transact-SQL 的连接发出的 SQL Server 语句的锁定行为和行版本控制行为。

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
sql
FILESTREAM-enabled databases support the following transaction isolation levels. (已启用 FILESTREAM 的数据库支持下列事务隔离级别)

隔离级别Transact SQL 访问文件系统访问
未提交读SQL Server 2019 (15.x)不支持
已提交读SQL Server 2019 (15.x)SQL Server 2019 (15.x)
可重复读SQL Server 2019 (15.x)不支持
可序列化SQL Server 2019 (15.x)不支持
读提交的快照SQL Server 2019 (15.x)SQL Server 2019 (15.x)
快照SQL Server 2019 (15.x)SQL Server 2019 (15.x)

SET Transaction Isolation Level Read语法的四种情况

第一种情况:

READ COMMITTED

作用:

指定在读取数据时控制共享锁以避免脏读,但数据可在事务结束前更改,从而产生不可重复读取或幻像数据。
该选项是 SQL Server 的默认值。

第二种情况:

READ UNCOMMITTED

作用:

执行脏读或0级隔离锁定,这表示不发出共享锁,也不接受排它锁。当设置该选项时,可以对数据执行未提交读或脏读;在事务结束前可以更改数据内的数值,行也可以出现在数据集中或从数据集消失。该选项的作用与在事务内所有语句中的所有表上设置 NOLOCK 相同。这是四个隔离级别中限制最小的级别。

第三种情况:

REPEATABLE READ

作用:

锁定查询中使用的所有数据以防止其他用户更新数据,但是其他用户可以将新的幻像行插入数据集,且幻像行包括在当前事务的后续读取中。因为并发低于默认隔离级别,所以应只在必要时才使用该选项。

第四种情况:

SERIALIZABLE

作用:

在数据集上放置一个范围锁,以防止其他用户在事务完成之前更新数据集或将行插入数据集内。这是四个隔离级别中限制最大的级别。因为并发级别较低,所以应只在必要时才使用该选项。该选项的作用与在事务内所有 SELECT 语句中的所有表上设置 HOLDLOCK 相同。

语法

基本语法

-- Syntax for SQL Server and Azure SQL Database

SET TRANSACTION ISOLATION LEVEL
    { READ UNCOMMITTED
    | READ COMMITTED
    | REPEATABLE READ
    | SNAPSHOT
    | SERIALIZABLE
    }

-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse
  
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

示例

USE Works20;  
GO  
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;  
GO  
BEGIN TRANSACTION;  
GO  
SELECT *   
    FROM sources.History;  
GO  
SELECT *   
    FROM sources.Department;  
GO  
COMMIT TRANSACTION;  
GO  

一、ROWLOCK的使用

1、ROWLOCK行级锁确保,在用户取得被更新的行,到该行进行更新,这段时间内不被其它用户所修改。因而行级锁即可保证数据的一致性,又能提高数据操作的并发性。

2、ROWLOCK告诉SQL Server只使用行级锁,ROWLOCK语法可以使用在SELECT,UPDATE和DELETE语句中

3、例如select语句中

A 连接中执行
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
begin tran
select * from tablename with (rowlock,UpdLock) where id=3
waitfor delay ‘00:00:05’
commit tran

B连接中如果执行
select * from tablename with (rowlock, updlock) where id=3 --则要等待5秒

C连接中如果执行
update tablename set colname=‘10’ where id <>3 --可立即执行

D连接中如果执行
update tablename set colname=‘10’ where id=3 --则要等待5秒

二、SQL Server中使用ROWLOCK需要注意的地方

1、如果你错误地使用在过多行上,数据库并不会聪明到自动将行级锁升级到页面锁,服务器也会因为行级锁的开销而消耗大量的内存和CPU,直至无法响应。

2、select 语句中,RowLock在不使用组合的情况下是没有意义的,With(RowLock,UpdLock) 这样的组合才成立,查询出来的数据使用RowLock来锁定,当数据被Update的时候,锁将被释放

内容来源

https://docs.microsoft.com/en-us/sql/t-sql/statements/set-transaction-isolation-level-transact-sql

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值