MLOAD выполняется в одной транзакции?
У меня есть задание MLOAD, которое вставляет данные из базы данных Oracle в базу данных Teradata. Одна из вещей, которую он делает, это удаление таблицы назначения и воссоздание ее. Наш производственный веб-сайт заполняет раскрывающийся список в зависимости от того, что находится в таблице назначения.
Если сценарий MLOAD находится не в одной транзакции, возможно, что раскрывающийся список не сможет заполниться должным образом, если привязка произойдет во время задания MLOAD. Однако, если это транзакция, это будет бесперебойный процесс, поскольку изменения не будут отображаться, пока транзакция не будет зафиксирована.
Я проверил dbc.DBQLogTbl
а также dbc.DBQLQryLogsql
просмотры после запуска задания MLOAD, и кажется, что внутри задания происходит несколько транзакций, поэтому может показаться, что вся работа не выполняется за одну транзакцию. Однако я хотел убедиться, что это действительно так, прежде чем делать предположения.
1 ответ
Транзакция в Teradata не может включать несколько операторов DDL, каждый DDL должен передаваться отдельно.
MLoad логически обрабатывается как одна транзакция, даже если вы видите несколько транзакций в DBQL, это шаги для подготовки и очистки.
Когда ваше приложение попытается выбрать из целевой таблицы все будет хорошо (если только оно не выполняет грязное чтение, используя LOCKING ROW FOR ACCESS).
Кстати, может быть другое сообщение об ошибке "таблица не существует", когда приложение пытается выбрать. Почему вы удаляете / воссоздаете таблицу вместо простого УДАЛЕНИЯ?
Другим решением было бы загрузить копию таблицы и использовать переключение представлений:
mload tab2;
replace view v as select * from tab2;
delete from tab1;
Следующая загрузка будет делать:
mload tab1;
replace view v as select * from tab1;
delete from tab2;
И так далее. Конечно, ваша нагрузочная работа должна реализовывать логику переключения.