Teradata - 如何选择没有锁定作家? (用于访问的锁定行与用于访问的锁定表)

时间:2017-04-27 12:52:23

标签: teradata rowlocking table-locking

我正在开发一个从Teradata DWH中获取一些数据的应用程序。 DWH开发人员告诉我在所有LOCK ROW FOR ACCESS查询之前使用SELECT以避免延迟对该表的写入。

非常熟悉MS SQL Server的WITH(NOLOCK)提示,我将LOCK ROW FOR ACCESS视为等效。但是,INSERTUPDATE语句不允许使用LOCK ROW FOR ACCESS(我不清楚为什么会失败,因为它应该适用于语句选择的表,而不是我插入的那个):

-- this works
LOCK ROW FOR ACCESS 
SELECT Cols
FROM Table

-- this does not work
LOCK ROW FOR ACCESS 
INSERT INTO SomeVolatile
SELECT Cols
FROM PersistentTable

我已经看到可以使用LOCKING TABLE ... FOR ACCESS,但不清楚它是否符合我的需要(NOLOCK等价 - 不要阻止写入。)

问题 INSERT声明中进行选择时,我应该使用哪些提示来最小化写入延迟?

3 个答案:

答案 0 :(得分:3)

您无法在INSERT-SELECT语句中使用LOCK ROW FOR ACCESS。 INSERT语句将对其写入的表进行WRITE锁定,并对其选择的表进行READ锁定。

如果您在INSERT-SELECT上获得LOCK ROW FOR ACCESS绝对必要,那么请考虑创建一个类似的视图:

 CREATE VIEW tmpView_PersistentTable AS
 LOCK ROW FOR ACCESS
 SELECT Cols FROM PersistentTable;

然后从视图中执行INSERT-SELECT:

 INSERT INTO SomeVolatile
 SELECT Cols FROM tmpView_PersistentTable;

答案 1 :(得分:1)

不是直接的答案,但我的理解是,这是您的用户/应用程序/等应通过视图访问数据的原因之一。视图锁定for access,这不会阻止插入/更新。从表中选择使用读锁定,这将阻止插入/更新。

缺点是访问锁定,存在脏读的可能性。

答案 2 :(得分:0)

如下所示更改您的查询,您应该做得很好。

LOCKING TABLE PersistentTable FOR ACCESS 
INSERT INTO SomeVolatile
SELECT Cols
FROM PersistentTable ;