Подтвердить что ты не робот

Можно ли запускать несколько операторов DDL внутри транзакции (в SQL Server)?

Мне интересно, можно ли запустить несколько транзакций DDL внутри транзакции. Меня особенно интересует SQL Server, хотя ответы с другими базами данных (как минимум, Oracle, PostgreSQL) также могут быть интересными.

Я делал некоторые "CREATE TABLE" и "CREATE VIEW" для созданной таблицы внутри транзакции, и, похоже, есть некоторые несоответствия, и мне интересно, не должны ли DDL не выполняться внутри транзакции..

Я мог бы, вероятно, переместить DDL за пределами транзакции, но Я хотел бы получить некоторые ссылки для этого. То, что я нашел до сих пор:

  • Страница MSDN Уровни изоляции в компоненте Database четко указывает, что существуют ограничения на то, какие операции DDL можно выполнить в явной транзакции, которая работает под изоляцией моментальных снимков, но я не использую изоляцию моментальных снимков, и это должно приводить к ошибке.
    • Это можно интерпретировать так, чтобы операции DDL могли выполняться в явной транзакции под разными уровнями изоляции?
  • Руководство пользователя Oracle® Database Gateway для SQL Server # Указания DDL утверждает, что в данной транзакции может выполняться только один оператор DDL - это это справедливо и для SQL Server, используемого прямо?

Для Oracle:

Если это имеет значение, я делаю это с помощью Java через JTDS-драйвер JDBC.

b.r. Токо

4b9b3361

Ответ 1

Я знаю, что большинство баз данных имеют ограничения, но Postgres этого не делает. Вы можете запускать любые создания таблицы номеров, изменения столбцов и изменения индексов в транзакции, а изменения не видны для других пользователей. COMMIT успешно завершен. То, как должны быть базы данных!: -)

Что касается SQL Server, вы можете запустить DDL внутри транзакции, но SQL Server не поддерживает метаданные версии, и поэтому изменения будут видны другие до совершения сделки. Но некоторые операторы DDL могут быть отброшены, если вы находитесь в транзакции, но для которых они работают, а какие нет, вам нужно будет выполните несколько тестов.

Ответ 2

Если вы создаете таблицы, представления и т.д. на лету (кроме табличных переменных или временных таблиц), вам действительно может понадобиться переосмыслить ваш дизайн. Это не то, что обычно должно происходить из пользовательского интерфейса. Даже если вы должны разрешить некоторую настройку, операторы DDL не должны выполняться одновременно с запуском транзакционных вставок/обновлений/удалений. Гораздо лучше отделить эти функции.

Это тоже то, что требует разумной дозы рассмотрения и тестирования относительно того, что происходит, когда два пользователя пытаются одновременно изменить структуру одной и той же таблицы, а затем запустить транзакцию для вставки данных. Есть некоторые действительно страшные вещи, которые могут произойти, когда вы разрешаете пользователям вносить коррективы в структуру вашей базы данных.

Также некоторые операторы DDL всегда должны быть первым выражением партии. Следите за тем, когда вы их запускаете.

Ответ 3

Может ли быть, что в MS SQL неявные транзакции запускаются при выполнении DDL и DML-операторов. Если вы отключите это, эта помощь поможет    SET IMPLICIT_TRANSACTIONS

EDIT: другая возможность  - Вы не можете комбинировать CREATE VIEW с другими операторами в той же партии. CREATE TABLE - это нормально. Вы разделяете партии с помощью GO.

EDIT2: вы можете использовать несколько DDL в транзакции, если они разделены GO, чтобы создать разные партии.

Ответ 4

В общем случае и IIRC небезопасно считать транзакции DDL транзакционными.

То есть, существует большая свобода в отношении того, как изменения схемы взаимодействуют внутри транзакции (при условии, что это вообще происходит). Это может быть как продавцом, так и конкретной установкой (т.е. До dba). Поэтому, по крайней мере, не используйте одну СУБД, чтобы предположить, что другие будут обрабатывать заявления DDL.

Изменить: MySql - это пример СУБД, который вообще не поддерживает транзакции DDL. Кроме того, если у вас есть репликация/зеркалирование базы данных, вы должны быть очень осторожны, чтобы служба репликации (репликация Sybase является нормой, верьте или нет) на самом деле будет реплицировать инструкцию DDL.