2012-07-31 37 views
1

我剛剛開始深入研究Teradata的鎖定功能,Google對此進行了相當複雜的解釋。希望我能從SE獲得一個非常簡單和簡化的答案。如何鎖定表進行讀取和寫入,以便我可以執行SQL,然後再刪除鎖?

在Teradata遇到許多與身份列有關的問題後,我決定創建一個模仿Oracle序列的機制。爲此,我創建了一個包含兩個字段的表格,一個保存表格名稱,另一個保存最後使用的序列。然後,我將創建一個存儲過程,該過程需要一個表名。在該過程中,將執行以下選項:

  • 選擇從序列表中最後使用的序列到一個變量(select LastId from mydb.sequence where tablename = :tablename
  • 添加1至變量的值,從而增加它
  • 更新序列表使用增加值
  • 返回序列變量的過程的OUT PARAM,所以我可以在我的.net應用程序中

同時獲得測序ID所有這些操作都在進行,我需要爲所有讀寫訪問鎖定序列表,以確保對過程的其他調用在目前正在進行排序的過程中不嘗試對錶進行排序。這顯然是爲了保持相同的序列不被同一個表使用兩次。

如果這是.NET,我會使用Sync Lock(VB.NET)或lock(C#)來阻止其他線程輸入一個代碼塊,直到當前線程完成。我想知道是否有一種方法可以鎖定一個表,就像我在.NET中鎖定一個線程一樣。

回答

1

考慮使用的顯式鎖定機構,用於一個rowhash鎖該事務:

BEGIN TRANSACTION; 

LOCKING ROW EXCLUSIVE 
SELECT LastId + 1 INTO :LastID 
FROM MyDB.SequenceCols 
WHERE TableName = :TableName 
    AND DatabaseName = :DatabaseName; 

UPDATE MyDB.SequenceCols 
SET LastId = :LastID 
WHERE TableName = :TableName 
    AND DatabaseName = :DatabaseName; 

END TRANSACTION; 

的rowhash鎖將允許通過針對其他表的其他過程中使用的過程。要確保行級鎖定,您必須完全限定SequenceCols表的主索引。事實上,SequenceCols表的主索引應該是DatabaseNameTableName上的UNIQUE。

編輯:

獨佔rowhash鎖會阻止,直到結束事務處理的rowhash鎖的擁有者讀取行另一工藝。

+0

如果此過程同時被調用兩次,並且兩個調用在兩個調用中的任何一個到達更新之前結束選擇相同的ID,會發生什麼情況? – oscilatingcretin 2012-07-31 17:30:38

+1

請參閱編輯以獲取有關獨佔行連鎖的更多說明。 – 2012-07-31 17:47:13

+0

所以我得到了一切工作。有沒有辦法測試這個鎖定是否正常工作?我自然想到找到一種方法讓存儲過程等待,這樣我就有足夠的時間發送另一個請求,但研究表明只有UDF才能做到這一點。 – oscilatingcretin 2012-08-01 12:51:24

相關問題