Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Это важно
Транзакции, записываемые в управляемые таблицы Delta каталога Unity, находятся в общедоступной предварительной версии.
Транзакции, записываемые в управляемые таблицы Iceberg каталога Unity, находятся в закрытой предварительной версии. Чтобы присоединиться к этой предварительной версии, отправьте форму регистрации на предварительный просмотр управляемых таблиц Iceberg.
Транзакции позволяют координировать операции в нескольких инструкциях и таблицах SQL. Все изменения успешно выполняются вместе или откатываются вместе, обеспечивая согласованность данных в операциях и таблицах. Транзакции обеспечивают гарантии ACID: атомарность, согласованность, изоляция и долговечность. См. Что такое гарантии ACID в Azure Databricks?. Транзакции можно использовать с хранимыми процедурами и скриптами SQL для создания критически важных рабочих нагрузок хранения.
В следующем примере показана транзакция:
BEGIN ATOMIC
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
INSERT INTO audit_log VALUES (1, 2, 100, current_timestamp());
END;
Все три выражения выполняются вместе. Если любая инструкция завершается ошибкой, все изменения отката и Databricks завершает транзакцию без побочных эффектов.
Практические рекомендации по транзакциям см. в руководстве по координации транзакций между таблицами.
Требования
Выполнение транзакций, охватывающих несколько инструкций или несколько таблиц:
- Все таблицы, в которые выполняется запись, должны:
- Управляемые таблицы каталога Unity (Delta или Iceberg)
- Активируйте фиксации, управляемые каталогом
- Используйте поддерживаемые вычислительные ресурсы:
- Для неинтерактивных транзакций используйте любое хранилище SQL, бессерверные вычисления или кластер под управлением Databricks Runtime 18.0 и более поздних версий.
- Для интерактивных транзакций используйте любое хранилище SQL.
- Для транзакций на ресурсах Delta Sharing используйте Databricks Runtime 18.1 и более поздние версии.
Режимы транзакций
Azure Databricks поддерживает два режима транзакций:
| Режим | Синтаксис | Зафиксировать | Откат | лучше всего подходит для |
|---|---|---|---|---|
| Неинтерактивный | ATOMIC составное выражение | Автоматически при успешном выполнении | Автоматический при ошибке | Фиксированные последовательности, запланированные задания |
| Interactive | BEGIN TRANSACTION; COMMIT; | Руководство | Руководство | Условная логика, проверка и отладка, JDBC, ODBC, PyDBC |
Подробный синтаксис, примеры и шаблоны использования для обоих режимов см. в разделе "Режимы транзакций".
Поддерживаемые операции
В транзакциях можно использовать следующие операции:
| Операция | Описание |
|---|---|
| SELECT | Запрос данных и проверка результатов |
| VALUES оговорка | Создание тестовых данных или константных значений |
| INSERT (включая все варианты) | Добавление новых строк |
| UPDATE | Изменение существующих строк |
COPY INTO |
Загрузка данных из файла в таблицу Delta |
| DELETE FROM | Удаление строк |
| MERGE INTO | Шаблоны upsert, объединяющие вставку, обновление и удаление |
Чтение источников в транзакциях
Транзакции могут считываться из таблиц каталога Unity (Delta и Iceberg), потоковой передачи таблиц, представлений и материализованных представлений. Используйте allow_nontransactional_reads указание для чтения из нетранзакционных источников.
Чтение из источников, не связанных с транзакциями
Чтобы прочитать данные из не транзакционных источников, таких как файлы Parquet, Avro files и федеративные таблицы с помощью JDBC, используйте allow_nontransactional_reads указание, как показано в следующем примере:
BEGIN TRANSACTION;
-- Read from a non-transactional Parquet source
INSERT INTO transactional_table
SELECT col1, col2
FROM parquet.`/path/to/data`
WITH (allow_nontransactional_reads = true);
-- Read from a managed Delta table (no hint needed)
INSERT INTO another_table
SELECT * FROM managed_delta_table;
COMMIT;
Предупреждение
Нетранзакционные операции чтения не повторяются. Одновременные изменения исходных данных во время транзакции могут привести к несогласованным считываниям.
Изоляция транзакций
Транзакции предоставляют повторяемые операции чтения во всех инструкциях. Когда вы получаете доступ к таблице в транзакции, Azure Databricks фиксирует согласованный снэпшот этой таблицы при первом доступе. Все последующие операции чтения этой таблицы используют этот моментальный снимок, поэтому операции чтения остаются согласованными, даже если другие пользователи одновременно изменяют одни и те же таблицы.
Пример:
BEGIN TRANSACTION;
-- First access to products table captures snapshot
SELECT * FROM products WHERE product_id = 1001;
-- Another user updates product 1001
-- Still reads the same snapshot (repeatable read)
SELECT * FROM products WHERE product_id = 1001;
COMMIT;
Обнаружение конфликтов и параллелизм
Azure Databricks использует оптимистическое управление параллелизмом. Транзакции выполняются без блокировки, и конфликты обнаруживаются во время фиксации изменений. При фиксации Azure Databricks проверяет, изменили ли другие транзакции те же данные после начала транзакции. Если существуют конфликты, транзакция завершается ошибкой. Для неинтерактивных транзакций откат также происходит автоматически. Для интерактивных транзакций необходимо явно выполнить ROLLBACK очистку состояния транзакции перед началом новой транзакции.
Неинтерактивные транзакции поддерживают параллелизм на уровне строк. Две транзакции могут изменять разные строки в одном файле данных, не конфликтуя при включении параллелизма на уровне строк в целевых таблицах.
Интерактивные транзакции поддерживают параллелизм на уровне таблицы.
Сценарии конфликтов
| Сценарий | Описание |
|---|---|
| Конфликты одновременной записи | Две транзакции обновляют или удаляют одни и те же строки. |
| Конфликты записи и чтения | Другая транзакция изменила строки, которые были прочитаны вашей транзакцией. Применяется только к уровню изоляции «Serializable». |
| Фантомные конфликты при чтении | Другая транзакция добавила новые строки, которые соответствуют предикату, использованному в операции чтения вашей транзакции. Применяется как к изоляции WriteSerializable, так и к сериализуемой изоляции. |
| Конфликты метаданных | Другая транзакция изменила схему или свойства таблицы. |
Дополнительные сведения об уровнях изоляции и разрешении конфликтов для транзакций см. в режимах транзакций. Сведения о уровнях изоляции и поведении конфликтов для таблиц Delta Lake в Azure Databricks см. в рекомендациях по оптимизации в Azure Databricks.
Как отображаются транзакции в журнале Delta
Каждая успешная транзакция отображается как одна запись в журнале delta таблицы независимо от количества отдельных операторов, запущенных в транзакции. Это обеспечивает четкий след аудита и упрощает процедуры восстановления.
Отдельные операции в транзакции доступны в виде метаданных JSON в записи журнала Delta для транзакции.
Обработка ошибок и откат
В следующей таблице описывается, как происходит откат ошибок для обоих типов транзакций:
| Сценарий | Поведение при неинтерактивных транзакциях | Поведение интерактивных транзакций |
|---|---|---|
| Сбой инструкции | Любое выражение, которое вызывает ошибку, приводит к немедленной автоматической отмене изменений. | Необходимо явно запустить ROLLBACK , чтобы отменить изменения, если сеанс по-прежнему активен. |
| Сбой логики проверки или бизнес-правил | Используйте SIGNAL для выброса исключения и активации автоматического отката. |
Запустите ROLLBACK , чтобы отменить изменения. |
| Отключение сеанса | Транзакция автоматически откатывается. | Транзакция автоматически откатывается. |
| Таймаут | Автоматически откатывается после 48 часов общей продолжительности. | Автоматически откатывается после 10 минут бездействия или 48 часов общей продолжительности (см. ограничения). Транзакция завершается без побочных эффектов, но необходимо явно запустить ROLLBACK , чтобы очистить состояние транзакции, если сеанс по-прежнему активен. |
Для интерактивных транзакций вы можете явно откатить с помощью инструкции ROLLBACK. Это полезно, если вы хотите отменить изменения на основе логики проверки или бизнес-правил или после сбоя инструкции, когда сеанс остается активным.
Лучшие практики
Следуйте этим рекомендациям, чтобы сократить конфликты и оптимизировать производительность транзакций.
Устранение конфликтов
- Сохранение коротких транзакций: длительные транзакции повышают вероятность конфликтов и удерживают ресурсы дольше.
- Проверка на ранней стадии: Убедитесь в выполнении предварительных условий в начале транзакции, чтобы быстро выявить ошибки.
- Databricks рекомендует неинтерактивные транзакции для большинства вариантов использования: неинтерактивные транзакции используют параллелизм на уровне строк. См. неинтерактивные транзакции.
- Повторите попытку при конфликтах: при возникновении конфликтов повторите транзакцию с обновленными данными.
Использование транзакций из разных клиентов
Транзакции работают в различных клиентских интерфейсах:
-
Редактор SQL и рабочие тетради: Используйте синтаксис
BEGIN ATOMIC ... END;илиBEGIN TRANSACTION; ... COMMIT;непосредственно в ячейках SQL либоspark.sql()в ноутбуках на Python или Scala. См. режимы транзакций. -
Приложения JDBC: используйте методы API JDBC (
setAutoCommit(false),commit(),rollback()) с драйвером JDBC Databricks версии 3.0.5 и выше. См. пример. Использование транзакций. Список неподдерживаемых операций JDBC в транзакциях см. в разделе "Неподдерживаемые операции JDBC". - Приложения ODBC: используйте драйвер ODBC Databricks версии 2.10.0 и выше. Список неподдерживаемых операций ODBC в транзакциях см. в разделе "Неподдерживаемые операции ODBC".
-
Приложения Python: используйте коннектор SQL Databricks с
autocommit=False. См. раздел "Соединитель SQL Databricks для Python". Список неподдерживаемых операций соединителя Python в транзакциях см. в разделе "Неподдерживаемые операции соединителя Python". - API выполнения инструкций: выполнение транзакций с помощью синтаксиса SQL с помощью вызовов API. См. раздел "Использование с API выполнения инструкций".
Ограничения
Следующие ограничения применяются к транзакциям, охватывающим несколько таблиц:
| Ограничение | Описание |
|---|---|
| Конфликты интерактивных транзакций | Интерактивные транзакции (BEGIN TRANSACTION; ... COMMIT;), используют более консервативное обнаружение конфликтов, чем неинтерактивные транзакции, и могут конфликтовать на уровне таблицы, за исключением INSERT операций, которые не читают из целевой таблицы. Используйте неинтерактивные транзакции (сложный оператор ATOMIC), когда важно обнаружение конфликтов на уровне строк. См. неинтерактивные транзакции. |
| Целевые объекты для записи | Вы можете записывать только в управляемые каталогом Unity таблицы Delta или Iceberg с включенной функцией catalogManaged таблицы. См. коммиты, управляемые каталогом. |
| Только операции DML | Транзакции поддерживают SELECT, INSERT, UPDATE, DELETE, COPY INTO и MERGE. Выполнение операций DDL, таких как CREATE TABLE, ALTER TABLEили DROP TABLEвне транзакций. |
| Операции метаданных не поддерживаются | Операции метаданных не работают внутри транзакций независимо от протокола. Сюда входят вызовы метаданных на основе RPC на основе Thrift (например, методы JDBC DatabaseMetaData и функции каталога ODBC), команды на основе SQL (SHOW TABLES, SHOW DATABASES, DESCRIBE TABLE) и SELECT запросы к information_schema таблицам или системным таблицам. Выполнение операций метаданных за пределами транзакций. |
COPY INTO Конкурентность |
Транзакция, выполняющая команду COPY INTO, завершается ошибкой, если другая команда COPY INTO выполняется параллельно для записи в ту же таблицу и фиксирует сначала. |
| Потоковая запись не поддерживается | Транзакционные записи в потоковые таблицы не поддерживаются. |
| Таблицы RLS и CLM не поддерживаются | Таблицы с фильтрами строк и масками столбцов не могут участвовать в транзакциях. |
| Ограничения таблицы и представления | Транзакция может считывать или записывать до 100 таблиц в сочетании и может считывать до 100 представлений. Каждая таблица может содержать до 100 промежуточных коммитов в транзакции. |
| Перемещение по времени не поддерживается | Нельзя использовать перемещение по времени в рамках транзакции. |
| Время ожидания перед переходом в режим простоя | Интерактивные транзакции откатываются через 10 минут бездействия. Транзакция завершается без побочных эффектов, но необходимо явно запустить ROLLBACK , чтобы очистить состояние транзакции, если сеанс по-прежнему активен. |
| Максимальная длительность | Все транзакции автоматически откатываются через 48 часов с момента их начала. Для интерактивных транзакций транзакция завершается без побочных эффектов, но необходимо явно запустить ROLLBACK , чтобы очистить состояние транзакции, если сеанс по-прежнему активен. |
| Требование к общим таблицам для Delta Sharing | Поставщики Delta Sharing должны совместно использовать таблицу WITH HISTORY, чтобы разрешить получателям выполнять транзакции в ней. Получатели могут выполнять транзакции с помощью любого типа вычислений. |
| Ограничения на вычислительные ресурсы для получателей Delta Sharing | Получатели Azure Databricks могут выполнять транзакции только в общих представлениях, материализованных представлениях, потоковых таблицах и внешних таблицах, отличных от Iceberg. Получатели в той же учетной записи Azure Databricks, что и их поставщик, должны использовать общие или бессерверные вычисления. Получатели в другой учетной записи должны использовать бессерверные вычисления. |
| Конфликт исходной таблицы Delta Sharing | Получатели Delta Sharing не могут в рамках одной транзакции ссылаться на общее представление и общую таблицу, которые обращаются к одной и той же исходной таблице. |
Дальнейшие действия
- Режимы транзакций
- Руководство. Координация транзакций между таблицами
- Коммиты, управляемые каталогом
- Уровни изоляции и конфликты записи