2017-07-18 54 views
-1

我有一個插入查詢,看起來像這樣:如何保證所有數據在同一事務中被插入到表中?

INSERT INTO Data1 (column1, column2) 
SELECT column1, column2 FROM Data2 

這個查詢大約需要30秒。在該30秒內,在查詢仍在運行時,有人可能會在Data2表中插入,刪除或修改數據。我該如何防止這種情況發生,或者在同一事務中包含更改?

+2

單個插入語句應該發生在單個事務中。 –

+0

我相信,當一個表正在被修改時,它可以獨佔訪問它,所有其他請求將被排隊,直到INSERT完成。也許你想要做多個查詢,在這種情況下,你回答了你自己的問題,使用交易。 – Havenard

+0

@Havenard我剛剛這樣做。不幸的是,情況並非如此。我只是嘗試插入多個記錄,但沒有提交事務。然後我在Data2中插入一條記錄。數據已插入。 – Luke101

回答

0

修改查詢WITH(NOLOCK) 使用此

INSERT INTO Data1 (column1, column2) 
SELECT column1, column2 FROM Data2 WITH(NOLOCK) 

這會工作。

0

如果您需要絕對肯定有變化插入過程中造成的數據,你可以使用TABLOCKX查詢提示...

INSERT INTO Data1 WITH (TABLOCKX) (column1, column2) 
SELECT column1, column2 FROM Data2 WITH (TABLOCKX); 

這會給你兩個表,直到排它鎖交易完成。

相關問題