Терадата - как выбрать без блокировки писателей? (БЛОКИРОВКА ДЛЯ ДОСТУПА против БЛОКИРОВКИ ДЛЯ ДОСТУПА)
Я разрабатываю приложение, которое получает некоторые данные из 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 ;