Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 SET TRANSACTION ISOLATION LEVEL SNAPSHOT  [new]
Aleksey-K
Member

Откуда: Москва
Сообщений: 3116
SQL 2005 SP2
На уровне базы данных включена SNAPSHOT ISOLATION LEVEL
(ALTER DATABASE .... SET ALLOW_SNAPSHOT_ISOLATION ON)
Вот такой код:
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
BEGIN TRANSACTION

CREATE TABLE #T1 (F1 INT)
....
DROP TABLE #T1
COMMIT TRANSACTION
Все прекрасно работает..
Но стоит только после создания временной таблицы добавить код:
CREATE INDEX IX1 ON #T1(F1)
то при вызове это хранимой процедуры получаю:
Transaction failed because this DDL statement is not allowed inside a snapshot isolation transaction. Since metadata is not versioned, a metadata change can lead to inconsistency if mixed within snapshot isolation.
Т.е. CREATE TABLE это не DDL, а CREATE INDEX - это DDL!
В чем тут дело? Никто не сталкивался?
С уважением, Алексей
4 мар 08, 15:08    [5368323]     Ответить | Цитировать Сообщить модератору
 Re: SET TRANSACTION ISOLATION LEVEL SNAPSHOT  [new]
ветерочек
Guest
дело в том что
Transaction failed because this DDL statement is not allowed inside a snapshot isolation transaction. Since metadata is not versioned, a metadata change can lead to inconsistency if mixed within snapshot isolation.
4 мар 08, 15:14    [5368374]     Ответить | Цитировать Сообщить модератору
 Re: SET TRANSACTION ISOLATION LEVEL SNAPSHOT  [new]
Le Peace
Member

Откуда: Москва
Сообщений: 8970
2ветерочек
автор
Т.е. CREATE TABLE это не DDL, а CREATE INDEX - это DDL!
4 мар 08, 15:28    [5368486]     Ответить | Цитировать Сообщить модератору
 Re: SET TRANSACTION ISOLATION LEVEL SNAPSHOT  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 75660
В MS SQL нет версионности для метаданных. Зачем Вам SNAPSHOT уровень изоляции для DDL операций?
4 мар 08, 15:28    [5368488]     Ответить | Цитировать Сообщить модератору
 Re: SET TRANSACTION ISOLATION LEVEL SNAPSHOT  [new]
Aleksey-K
Member

Откуда: Москва
Сообщений: 3116
ветерочек
дело в том что
Transaction failed because this DDL statement is not allowed inside a snapshot isolation transaction. Since metadata is not versioned, a metadata change can lead to inconsistency if mixed within snapshot isolation.

Ну а разве CREATE TABLE не вносит изменения в метаданные?
С этой точки зрения, чем CREATE TABLE "лучше", чем CREATE INDEX ?
С уважением, Алексей
4 мар 08, 15:28    [5368489]     Ответить | Цитировать Сообщить модератору
 Re: SET TRANSACTION ISOLATION LEVEL SNAPSHOT  [new]
Aleksey-K
Member

Откуда: Москва
Сообщений: 3116
pkarklin
В MS SQL нет версионности для метаданных. Зачем Вам SNAPSHOT уровень изоляции для DDL операций?

1. А CREATE TABLE не изменение метаданых? Это не DDL команда? Почему не ругается на нее?
2. Мне нужна временная таблица. Просто команда попала в BEGIN TRAN .... COMMIT TRAN
С уважением, Алексей.
4 мар 08, 15:31    [5368509]     Ответить | Цитировать Сообщить модератору
 Re: SET TRANSACTION ISOLATION LEVEL SNAPSHOT  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 75660
Aleksey-K
pkarklin
В MS SQL нет версионности для метаданных. Зачем Вам SNAPSHOT уровень изоляции для DDL операций?

1. А CREATE TABLE не изменение метаданых? Это не DDL команда? Почему не ругается на нее?
2. Мне нужна временная таблица. Просто команда попала в BEGIN TRAN .... COMMIT TRAN
С уважением, Алексей.


1. Таблицы не было, Вы ее создали.

Читаем BOL:

SQL Server does not keep multiple versions of system metadata. Data definition language (DDL) statements on tables and other database objects (indexes, views, data types, stored procedures, and common language runtime functions) change metadata. If a DDL statement modifies an object, any concurrent reference to the object under snapshot isolation causes the snapshot transaction to fail. Read-committed transactions do not have this limitation when the READ_COMMITTED_SNAPSHOT database option is ON.

Т.е. создать\удалить объект можно,
USE AdventureWorks;
GO
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
GO
BEGIN TRAN

CREATE TABLE t1(col int)
GO

DROP TABLE t1
GO
COMMIT TRANSACTION

но вот внести изменения в него - уже нет

USE AdventureWorks;
GO
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
GO
BEGIN TRAN

CREATE TABLE t1(col int)
GO
ALTER TABLE t1 ADD col1 int
GO
DROP TABLE t1
GO
COMMIT TRANSACTION

2. Создавайте ее и индекс вне транзакции, исправив логическую ошибку в коде.
4 мар 08, 15:42    [5368607]     Ответить | Цитировать Сообщить модератору
 Re: SET TRANSACTION ISOLATION LEVEL SNAPSHOT  [new]
Aleksey-K
Member

Откуда: Москва
Сообщений: 3116
pkarklin
Aleksey-K
pkarklin
В MS SQL нет версионности для метаданных. Зачем Вам SNAPSHOT уровень изоляции для DDL операций?

1. А CREATE TABLE не изменение метаданых? Это не DDL команда? Почему не ругается на нее?
2. Мне нужна временная таблица. Просто команда попала в BEGIN TRAN .... COMMIT TRAN
С уважением, Алексей.


1. Таблицы не было, Вы ее создали.

Читаем BOL:

SQL Server does not keep multiple versions of system metadata. Data definition language (DDL) statements on tables and other database objects (indexes, views, data types, stored procedures, and common language runtime functions) change metadata. If a DDL statement modifies an object, any concurrent reference to the object under snapshot isolation causes the snapshot transaction to fail. Read-committed transactions do not have this limitation when the READ_COMMITTED_SNAPSHOT database option is ON.

Т.е. создать\удалить объект можно,
USE AdventureWorks;
GO
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
GO
BEGIN TRAN

CREATE TABLE t1(col int)
GO

DROP TABLE t1
GO
COMMIT TRANSACTION

но вот внести изменения в него - уже нет

USE AdventureWorks;
GO
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
GO
BEGIN TRAN

CREATE TABLE t1(col int)
GO
ALTER TABLE t1 ADD col1 int
GO
DROP TABLE t1
GO
COMMIT TRANSACTION

2. Создавайте ее и индекс вне транзакции, исправив логическую ошибку в коде.

Спасибо за подробный ответ. Я так и сделал.
Но все-таки в документации, как мне кажется, не совсем это ограничение четко прописано. Ведь CREATE TABLE тоже меняет метаданные.
Всем спасибо.
С уважением, Алексей.
4 мар 08, 16:07    [5368829]     Ответить | Цитировать Сообщить модератору
 Re: SET TRANSACTION ISOLATION LEVEL SNAPSHOT  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 75660
Aleksey-K
Спасибо за подробный ответ. Я так и сделал.
Но все-таки в документации, как мне кажется, не совсем это ограничение четко прописано. Ведь CREATE TABLE тоже меняет метаданные.


Ключевое слово - multiple.
4 мар 08, 16:08    [5368849]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: SET TRANSACTION ISOLATION LEVEL SNAPSHOT  [new]
egorrezchikov
Member

Откуда:
Сообщений: 3
Добрый день!
Возникла похожая ошибка, но при другом сценарии: параллельно выполняется две операции, одна из операций выполняется при уровне изоляции SNAPSHOT, другая с использованием временной таблицы (создание временной таблицы, вставка данных во временную таблицу) уровень изоляции по умолчанию, опция READ_COMMITTED_SNAPSHOT в БД OFF. Операция которая использует временную таблицу завершается с ошибкой из первого сообщения "Transaction failed because this DDL statement is not allowed inside a snapshot isolation transaction. Since metadata is not versioned, a metadata change can lead to inconsistency if mixed within snapshot isolation."

В статье есть пример https://technet.microsoft.com/ru-ru/library/ms179599(v=sql.105).aspx и говорится, что "При попытке вызвать таблицу HumanResources.Employee во время выполнения инструкции ALTER INDEX все активные транзакции моментальных снимков получат сообщение об ошибке после завершения выполнения инструкции ALTER INDEX. Это не относится к участвующим в считывании транзакциям, которые применяют управление версиями строк."
Поможет ли решить данную проблему включение READ_COMMITTED_SNAPSHOT в БД?
3 окт 17, 16:51    [20839599]     Ответить | Цитировать Сообщить модератору
 Re: SET TRANSACTION ISOLATION LEVEL SNAPSHOT  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 3604
egorrezchikov,
по вашему описанию, операция не в изоляции снапшота вываливается с ошибкой? слабо верится.
3 окт 17, 17:22    [20839723]     Ответить | Цитировать Сообщить модератору
 Re: SET TRANSACTION ISOLATION LEVEL SNAPSHOT  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 3604
снапшот достаточно жестокая изоляция как к структуре так и к изменениям данных, вам она точно нужна? Может вам просто RSCI достаточно
3 окт 17, 17:27    [20839748]     Ответить | Цитировать Сообщить модератору
 Re: SET TRANSACTION ISOLATION LEVEL SNAPSHOT  [new]
egorrezchikov
Member

Откуда:
Сообщений: 3
TaPaK, пытаюсь избавиться от deadlock, deadlock's возникают при операциях обновления и добавления данных и выполняются через Entity Framework, почитав в интернете советы о том как их избежать при использовании EF остановился на SNAPSHOT, хотя тут на форме пишут, что SNAPSHOT используется при конфликте чтения и записи, мб нужно двигаться в другом направлении?
Пример deadlock прикрепил.

К сообщению приложен файл. Размер - 85Kb
3 окт 17, 17:45    [20839821]     Ответить | Цитировать Сообщить модератору
 Re: SET TRANSACTION ISOLATION LEVEL SNAPSHOT  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 3604
egorrezchikov,

да снапшот вам развяжет только читателей и писателей, что в общем наиболее частый случай дедлока. И RSCI а не SNAPSHOT. Дедлок разбирать, заводите тему с нормальным описанием или чаще всего решается правильной расстановкой изменений
3 окт 17, 17:47    [20839837]     Ответить | Цитировать Сообщить модератору
 Re: SET TRANSACTION ISOLATION LEVEL SNAPSHOT  [new]
egorrezchikov
Member

Откуда:
Сообщений: 3
TaPaK, спасибо за совет.
3 окт 17, 17:52    [20839871]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить