我有2表(A,B),以及1查詢SQL查詢執行不止一次?
我的查詢是這樣
- 閱讀從
- 更新B帶從A
- 這個數據使用更新表B,A的設定最終值
實施例執行可以找到以下問題: Proper way to keep a single data in sql server?
現在,因爲所有的處理被連接時,這個查詢不應兩次在同一時間,直到該過程結束執行,或者由2個不同的用戶。我如何防止這種情況?或者它已經像這樣安全地工作了?
我有2表(A,B),以及1查詢SQL查詢執行不止一次?
我的查詢是這樣
實施例執行可以找到以下問題: Proper way to keep a single data in sql server?
現在,因爲所有的處理被連接時,這個查詢不應兩次在同一時間,直到該過程結束執行,或者由2個不同的用戶。我如何防止這種情況?或者它已經像這樣安全地工作了?
使用事務鎖:
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
事務執行期間,任何嘗試讀取或從/到表會超時......
寫鎖定表2秒的目的是什麼?他們是不是已經鎖定,直到交易結束? – HOY
當然是!但是這是一個選項,可以保持鎖定一段時間。例如,如果我們想插入考題並隱藏他們的表格,直到下午3點(考試開始時間)。在此之前,任何學生都不能看到問題。 –
編輯: ü必須使用,一些鎖,而更新鎖定分貝。 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
我希望你的表A和B必須是具有一定Primary Key
如EmployeeID
。在這種情況下,簡單的解決方案是創建一個表(比如說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.
希望它能幫助。
相互關係如何表? –
@JohnWoo並不涉及太多的表在我鏈接的例子一樣。 – HOY