ЧИТАЙТЕ SNAPSHOT SNAPSHOT проти SNAPSHOT


23

Я досліджував відмінності між рівнями SQL Server READ COMMITTED SNAPSHOTта SNAPSHOTрівнями ізоляції і натрапив на наступний ресурс:

Вибір рівнів ізоляції на основі версій

Для більшості застосунків рекомендується прочитати дозволену ізоляцію з використанням версії версій над ізоляцією знімків з наступних причин:

  • Він споживає менше tempdb місця, ніж ізоляція знімків.

  • Ізоляція знімка вразлива для оновлення конфліктів, які не застосовуються для читання скоєної ізоляції за допомогою версійної версії. Коли транзакція, запущена під ізоляцією знімка, читає дані, які потім змінюються іншою транзакцією, оновлення транзакції знімком на ті самі дані викликає конфлікт оновлення, і транзакція закінчується і відкочується назад. Це не проблема з читкою, дозволеною ізоляцією за допомогою версії версій.

Я дещо новачок у цих темах, але я, здається, не розумію двох точок кулі за посиланням вище.

  1. Чому простір tempdb відрізнятиметься для цих режимів? Чи зберігається одна більш деталізована версія, ніж інша?

  2. Чому ізоляція знімків більш вразлива для оновлення конфліктів?

Відповіді:


18
  1. READ COMMITTED SNAPSHOTвикористовує новий знімок після кожного твердження. Це означає, що менше рядкових версій зберігається в живих. (Заява, яку ви цитуєте з документів, злегка вводить в оману, тому що це дозволяє припустити, що це завжди правда - це справедливо лише у випадку тривалих SNAPSHOTтранзакцій.) Версії зйомок рядків рядків створюються в режимі записи. Читання не впливають на те, що потрапляє в tempdb. Письменники не можуть передбачити, що прочитання буде здійснено в майбутньому. Читачі впливають лише на те, що можна очистити.
  2. Коли SNAPSHOTтранзакція T1записує у рядок, який був змінений іншою транзакцією T2за час між T1початком та T1спробою запису, оператор не працює із помилкою конфлікту оновлення. Це оптимістична модель одночасності. З READ COMMITTED SNAPSHOT T1зачекав би, T2щоб випустити X-замок у рядку і продовжувати нормально.

1
Чи можна стверджувати, що для №2 можна сказати, що SNAPSHOT не блокується виключно для оновлень - він просто спирається на версію версій?
Джон Рассел

1
@JohnRussell він робить блокування виключно для підтримки відката. Усі записи мають X-lock, щоб забезпечити відновлення рядка у разі відкату.
usr

0

Ще одна різниця між знімком і читанням зробленого знімка полягає в наступному.

  1. Знімок

На першій сесії

ВСТАНОВИТИ РІВНІ ІЗОЛАЦІЙНИЙ РІВНІЙ СНАПШОТ ПОЧАТИ TRAN SELECT * ВІД TB1 ..... .....

У другій сесії

Оновіть TB1 SET NAME = NAME + 'test' Where id = 1

На першій сесії

ВИБІР * ВІД TB1 - ЦЕ ВІН поверне ім'я значення для ID = 1, а не name + 'test' COMMIT TRAN

У знімку зробленого читання перший вибір в сеансі 1 поверне ім'я для id = 1, а другий вибір поверне ім'я + 'тест'.

Таким чином, в ізоляції знімків SQL SERVER робить знімок на початку транзакції і читає з цього знімка протягом усієї транзакції.

Під час читання зробленого знімка знімок робиться для кожного оператора SELECT під час транзакції.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.