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?
希望我很清楚:)
谢谢.
您必须持有锁定交易的持续时间.也是专属.
现在,我不确定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,然后看看是否可以从第二个窗口进行选择。如果该语句没有返回,则意味着该行已被锁定,并且一切正常。
我假设,在您的问题中,您的意思是在选择行后更新该行,而不是插入它(插入创建新行,更新更改现有行)