Можно ли запустить несколько операторов DDL внутри транзакции (внутри SQL Server)? - PullRequest
29 голосов
/ 25 июня 2009

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

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

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

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

Для Oracle:

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

b.r. Ток

Ответы [ 4 ]

13 голосов
/ 29 июля 2010

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

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

4 голосов
/ 25 июня 2009

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

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

Также некоторые операторы DDL всегда должны быть первым оператором пакета. Обращайте на это внимание и во время их запуска.

1 голос
/ 25 июня 2009

Для общего случая и IIRC небезопасно предполагать, что операторы DDL являются транзакционными.

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

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

1 голос
/ 25 июня 2009

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

РЕДАКТИРОВАТЬ: другая возможность - Вы не можете комбинировать CREATE VIEW с другими операторами в одном пакете. CREATE TABLE в порядке. Вы разделяете партии с помощью GO.

РЕДАКТИРОВАТЬ2: Вы МОЖЕТЕ использовать несколько DDL в транзакции, если они разделены с помощью GO для создания разных пакетов.

...