sql-server - 如何根据隔离级别读取原始数据

标签 sql-server t-sql isolation-level

我的测试表:

CREATE TABLE [dbo].[Personel](
    [PersonelID] [int] NOT NULL,
    [Name] [nchar](10) NULL,
 CONSTRAINT [PK_Personel] PRIMARY KEY CLUSTERED 
(
    [PersonelID] ASC
)
)

我的测试数据:

insert into Personel
values (1, 'Jack')
, (2, 'John')
, (3, 'Kevin')

连接A:

begin tran
update Personel
set Name = 'Michael'
where PersonelID = 1

连接 B:

SET TRANSACTION ISOLATION LEVEL ????

SELECT Name 
FROM Personel WITH (????)
where PersonelID = 1

连接 A 启动事务并尝试更新数据,但事务仍在继续。连接 B 尝试读取正在更新的数据。

有没有办法(隔离级别或提示或这两者的组合)在事务提交或回滚之前查看原始数据(Jack,而不是 Michael)?

最佳答案

您可以在 SNAPSHOT 隔离级别访问旧版本的数据。

这要求数据库在开始之前启用快照隔离:

ALTER DATABASE <dbname> SET ALLOW_SNAPSHOT_ISOLATION ON

然后连接B

SET TRANSACTION ISOLATION LEVEL SNAPSHOT

select * from Personel

快照隔离存在一些性能考虑因素,因为它会重复读取到 tempdb 中的行。

Documentation reference

关于sql-server - 如何根据隔离级别读取原始数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11538285/

相关文章:

SQL 输出 Y/N 比较不同表中的日期列

sql-server - 提高表值函数性能

mysql - 读取未提交和内连接 : can a query failed?

java - 在 Websphere 数据源中为 Sybase 数据源设置隔离级别

java - 在 jooq 3.11.11 试用版的 META-INF/maven/plugin.xml 中找不到插件描述符

sql 循环遍历表中的每一行

sql-server - UNPIVOT 返回数据类型

java.sql.Connection 隔离级别

c# - 如何使用linq将excel文件上传到数据库?

sql-server - SQL Server 从 nvarchar 到 varbinary,然后从 varbinary 到 nvarchar 的转换保真度