Зачем обновлять операцию удаления блока транзакции в базе данных sql-сервера с изоляцией снимка?
У меня есть 2 таблицы в моей базе данных. Это Предмет и Поле. Item - это таблица с собственной ссылкой для реализации дерева. Это означает, что в таблице Item у меня есть столбцы ID и ParentId. Таким образом, мы можем хранить дерево в таблице Item. Поле - это таблица для хранения других свойств расширения для элемента. Таблица полей имеет столбец с именем "Item_ID" для ссылки на таблицу элементов.
Хорошо, теперь мы просто хотим добавить транзакцию к операции базы данных. Мы нашли странное поведение в качестве названия.
По просьбе Microsoft мы запускаем следующий sql, чтобы включить изоляцию моментальных снимков нашей базы данных:
ALTER DATABASE AdventureWorks2008R2
SET READ_COMMITTED_SNAPSHOT ON;
ALTER DATABASE AdventureWorks2008R2
SET ALLOW_SNAPSHOT_ISOLATION ON;
И тогда мы делаем следующий тест:
Откройте 2 тестовые программы
Первая программа обновит элемент 1 и будет заблокирована до совершения транзакции.
Используйте вторую программу, чтобы попытаться удалить Элемент 2. Элемент 1 не имеет отношения к Элементу 2. Это означает, что Элемент 1 не является родителем / дочерним элементом для элемента 2.
Затем мы обнаружили, что вторая программа заблокирована первой. Если мы продолжим первую программу, то вторая программа завершит работу, если время не истекло.
Я чувствую себя странно об этом результате. Потому что я думаю, что могу удалить пункт 2, даже если пункт 1 находится в транзакции. Кто знает, почему это происходит?
1 ответ
Похоже, что вы вообще не получаете SNAPSHOT ISOLATION (так как конфликт обновлений / удалений должен вызывать сбой, а не окончательное завершение).
Вы буквально не казнили ALTER DATABASE AdventureWorks2008R2...
- а ты?
Поскольку "AdventureWorks2008R2" необходимо заменить именем вашей базы данных...