Терадата - как выбрать без блокировки писателей? (БЛОКИРОВКА ДЛЯ ДОСТУПА против БЛОКИРОВКИ ДЛЯ ДОСТУПА)

Я разрабатываю приложение, которое получает некоторые данные из Teradata DWH. Разработчики DWH сказали мне использовать LOCK ROW FOR ACCESS прежде всего SELECT запросы, чтобы избежать задержки записи в эту таблицу (ы).

Быть очень знакомым с серверами MS SQL WITH(NOLOCK) намек, я вижу LOCK ROW FOR ACCESS как его эквивалент. Тем не мение, INSERT или же UPDATE заявления не позволяют использовать 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 ответа

Решение

Вы не можете использовать LOCK ROW FOR ACCESS на инструкции INSERT-SELECT. Оператор INSERT устанавливает блокировку WRITE для таблицы, в которую он записывает, и блокировку READ для таблиц, из которых он выбирает.

Если это абсолютно необходимо, чтобы вы получили LOCK ROW FOR ACCESS на INSERT-SELECT, затем подумайте о создании вида, как:

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

А затем выполните ваш INSERT-SELECT из представления:

 INSERT INTO SomeVolatile
 SELECT Cols FROM tmpView_PersistentTable;

Не прямой ответ, но я всегда понимал, что это одна из причин, по которой ваши пользователи / приложения / и т. Д. Должны получать доступ к данным через представления. Блокировка просмотров for access, что не мешает вставкам / обновлениям. Выбор из таблицы использует блокировки чтения, что предотвратит вставки / обновления.

Недостатком является блокировка доступа, существует возможность грязного чтения.

Измените ваш запрос, как показано ниже, и вы должны быть хорошими.

LOCKING TABLE PersistentTable FOR ACCESS 
INSERT INTO SomeVolatile
SELECT Cols
FROM PersistentTable ;
Другие вопросы по тегам