2010-10-15 67 views
5

我有這樣的情況。使用哪種隔離級別來防止數據被讀取?

查詢是這樣的。

Select * from TABLE where ID = 1 

(什麼是查詢:)

後,我改變的東西,行,用新的ID插入。

我想阻止其他查詢從查詢中讀取第一個原始行,直到完成讀取和插入爲止。在那之後。

基本上我想要選擇並插入到事務中,隔離級別將阻止只從該行讀取,直到插入完成。

OleDbTransaction是在玩,因爲我使用SQL Server 6.5(哦,是的,你沒有看錯,不要問爲什麼:)

我是通過隔離級別描述挖,但不能完全理解他們,並找到解決方案對於我的問題,所以我的問題是什麼隔離級別使用OleDbTransaction

希望我很清楚:)

謝謝。

回答

-1

您需要對行進行鎖定:在讀取行之前創建鎖定,並在更新行之後釋放鎖定。

甲骨文和類似的數據庫,讀不鎖,所以你需要做的(在一個事務)以下:

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

MS SQL,我真的不知道,最簡單的方法是嘗試以下操作:打開連接到數據庫的兩個窗口,在兩個窗口中啓動事務,執行SELECT,並查看是否可以從第二個窗口執行選擇。如果語句沒有返回,這意味着該行被鎖定,並且你很好。

我想,在你的問題,你的意思是更新行你選擇後,不插入它(插入創建一個新的行,更新更改現有行)

+0

無用的答案,因爲MS SQL中的基本隔離級別比Oracle更寬鬆 – Andrey 2010-10-15 15:59:23

+0

-1您爲什麼在SQL Server時回答Oracle,然後提及您不需要知道它嗎? – gbn 2010-10-15 16:00:27

+0

首先,互聯網上的某個人可能會遇到這個頁面,並且正在使用Oracle,所以我想我可能會加入它;其次它可能在SQL Server中是類似的,所以它可能是一個指向正確方向的指針。 – 2010-10-15 16:14:13

0

描述的情形被稱爲Phantom Read。所以你需要串行化隔離(SERIALIZABLE

+0

爲什麼這是downvoted? – Andrey 2010-10-15 16:26:28

+0

首先我把這個隔離級別,然後幾個人,但在任何情況下,我得到錯誤說,執行相同的選擇查詢的其他進程陷入死鎖,併成爲死鎖的受害者,並取消。似乎這個事情與隔離水平不是我的解決方案或我做錯了什麼.. – 100r 2010-10-15 19:45:46

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只是頁鎖。但已經有一段時間了。當時我有頭髮和牙齒:-)

+0

我不能使用表鎖。因爲有時會出現一些真正的重質問題,而TABLOCKX會鎖定桌面嗎? – 100r 2010-10-15 16:17:53

+0

請參閱更新 – gbn 2010-10-15 16:23:24

+0

tnx。我無法使任何鎖工作。查詢不會編譯。也許6.5 sintax是不同的。我會在星期一上班的時候試試它,感謝上帝,我沒有6.5在家裏:) – 100r 2010-10-15 19:39:10