2012-10-08 126 views
0

我有2表(A,B),以及1查詢SQL查詢執行不止一次?

我的查詢是這樣

  1. 閱讀從
  2. 更新B帶從A
  3. 這個數據使用更新表B,A的設定最終值

實施例執行可以找到以下問題: Proper way to keep a single data in sql server?

現在,因爲所有的處理被連接時,這個查詢不應兩次在同一時間,直到該過程結束執行,或者由2個不同的用戶。我如何防止這種情況?或者它已經像這樣安全地工作了?

+0

相互關係如何表? –

+0

@JohnWoo並不涉及太多的表在我鏈接的例子一樣。 – HOY

回答

1

使用事務鎖:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 
GO 

BEGIN TRANSACTION 

--select * from A 
-- update B .... 
--update A 

WAITFOR DELAY '00:00:02' -- tables remain locked for 2 secs hh:mm:ss 

commit TRANSACTION 

事務執行期間,任何嘗試讀取或從/到表會超時......

+0

鎖定表2秒的目的是什麼?他們是不是已經鎖定,直到交易結束? – HOY

+0

當然是!但是這是一個選項,可以保持鎖定一段時間。例如,如果我們想插入考題並隱藏他們的表格,直到下午3點(考試開始時間)。在此之前,任何學生都不能看到問題。 –

1

編輯: ü必須使用,一些鎖,而更新鎖定分貝。 http://msdn.microsoft.com/en-us/library/ms173763.aspx

爲üpsedo代碼:

int x=(select val from tableB)+1 
query="update tableB set tableB.field="+x+"where......." 
if query executed successfully: 
    update tableA 
+0

你在我的sql查詢中寫了第二行,那麼第一行和第三行呢? – HOY

+0

我想在這個查詢中包含所有三個在一起。不是嗎? – DevT

+0

我有一個SQL語句和3點不同的過程,因爲我在我的問題表現出的行號。 – HOY

1

我希望你的表A和B必須是具有一定Primary KeyEmployeeID。在這種情況下,簡單的解決方案是創建一個表(比如說Lock_Table)這保持EmployeeID beign改性的記錄。
所以在這裏,你會需要這樣的:

BEGIN TRANSACTION 
1- Read EmployeeID From A 
2- Check if EmployeeID already exists in Lock_Table. If Yes then Quit Else insert that EmployeeID in Lock_Table 
3- Update B with this data(EmployeeID in this case) from A 
4- Using the updated table B, set final value of A. 
5- Delete this EmployeeID from the Lock_Table 
COMMIT TRANSACTION 

On any error ROLLBACK the Transaction. 

希望它能幫助。