5

我有这样的情况。

查询是这样的。

Select * from TABLE where ID = 1

(什么查询:)

之后,我更改了该行中的内容并使用新 ID 插入它。

我想防止其他查询从query读取第一行原始行,直到我完成读取和插入。在那之后..继续。

基本上我希望 select 和 insert 处于事务中,其隔离级别将阻止仅从该行读取,直到插入完成。

OleDbTransaction因为我使用的是 SQL Server 6.5(哦,是的,你没看错,不要问为什么:)

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

希望我很清楚:)

谢谢。

4

2 回答 2

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

编辑:

我的更改旨在将单行独占(以细粒度)锁定到事务结束。

但是,IIRC ROWLOCK 是随 SQL Server 7 添加的,而 6.5 只是页面锁。但已经有一段时间了。那时我有头发和牙齿:-)

于 2010-10-15T16:01:35.867 回答
-1

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

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

SELECT * FROM table WHERE id=? FOR UPDATE
...
UPDATE table ....

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

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

于 2010-10-15T15:57:23.807 回答