使用哪种隔离级别来防止数据被读取?

100*_*00r 5 .net c# sql-server transactions isolation-level

我有这样的情况.

查询是这样的.

Select * from TABLE where ID = 1
Run Code Online (Sandbox Code Playgroud)

(什么是查询:)

之后我改变了那一行中的东西并用新的id插入它.

我想阻止其他查询从查询中读取第一个原始行,直到我完成读取和插入.在那之后..前进.

基本上我想要select和insert在事务中,隔离级别将阻止从该行读取直到插入完成.

OleDbTransaction 是在玩,因为我使用SQL Server 6.5(哦,是的,你读得对,不要问为什么:)

我正在挖掘隔离级别描述,但不能完全理解它们并为我的问题找到解决方案,所以我的问题是使用什么隔离级别OleDbTransaction

希望我很清楚:)

谢谢.

gbn*_*gbn 5

您必须持有锁定交易的持续时间.也是专属.

现在,我不确定SQL Server 6.5的正确选项.从那以后,没有使用它,呃,199x

BEGIN TRAN

--edit, changed to XLOCK, ROWLOCK, HOLDLOCK
SELECT * from TABLE WITH (XLOCK, ROWLOCK, HOLDLOCK) where ID = 1
...
INSERT

COMMIT
Run Code Online (Sandbox Code Playgroud)

编辑:

我的更改旨在将单行(精细粒度)锁定到事务结束.

但是,IIRC ROWLOCK添加了SQL Server 7和6.5只是页锁.但已经有一段时间了.我当时有头发和牙齿:-)


Adr*_*ith -1

您需要对该行加锁:在读取该行之前创建锁,并在更新该行后释放锁。

Oracle和类似的数据库中,读取不会锁定,因此您需要执行以下操作(在事务中):

SELECT * FROM table WHERE id=? FOR UPDATE
...
UPDATE table ....
Run Code Online (Sandbox Code Playgroud)

MS SQL中,我不太确定,最简单的方法是尝试以下操作:打开连接到数据库的两个窗口,在两个窗口中启动一个事务,执行 SELECT,然后看看是否可以从第二个窗口进行选择。如果该语句没有返回,则意味着该行已被锁定,并且一切正常。

我假设,在您的问题中,您的意思是在选择行后更新该行,而不是插入它(插入创建新行,更新更改现有行)