Відповіді:
Цей рівень ізоляції дозволяє брудно читати. В одній транзакції можуть відображатися неспроможні зміни, внесені в результаті іншої транзакції.
Для підтримки найвищого рівня ізоляції СУБД, як правило, отримує блокування даних, що може призвести до втрати одночасності та великих витрат на блокування. Цей рівень ізоляції розслаблює цю властивість.
Ви можете ознайомитися зі статтею Вікіпедії наREAD UNCOMMITTED
декількох прикладах та читати далі.
Можливо, вам також буде цікаво ознайомитись із статтею блогу Джеффа Етвуда про те, як він та його команда вирішили проблему з тупиком у перші дні Stacka Overflow. За словами Джеффа:
Але
nolock
небезпечно? Чи можете ви прочитати недійсні дані зread uncommitted
увімкнутим? Так, теоретично. Ви не знайдете дефіциту космонавтів архітектури баз даних, які починають скидати науку про кислотні кислоти на вас і всіх, але не тягнуть будинок пожежної сигналізації, коли ви скажете їм, що хочете спробуватиnolock
. Це правда: теорія страшна. Але ось що я думаю: "У теорії немає різниці між теорією та практикою. На практиці існує".Я ніколи не рекомендував би використовувати
nolock
як загальне "корисне для того, що вас неприємно", виправити зміїну олію для будь-яких проблем із затримкою даних у базі даних. Спершу слід спробувати діагностувати джерело проблеми.Але на практиці додавання
nolock
до запитів, які ви абсолютно знаєте, - це прості, зрозумілі лише справи для читання, ніколи не призводять до проблем ... Поки ви знаєте, що робите.
Однією з альтернатив READ UNCOMMITTED
рівня, який ви можете розглянути, є READ COMMITTED SNAPSHOT
. Знов цитую Джеффа:
Знімки покладаються на абсолютно новий метод відстеження змін даних ... більше, ніж лише незначні логічні зміни, він вимагає від сервера обробляти дані фізично по-іншому. Коли цей новий метод відстеження змін даних увімкнено, він створює копію або знімок кожної зміни даних. Читаючи ці знімки, а не живі дані в часи суперечок, Спільні блокування більше не потрібні для читання, і загальна продуктивність бази даних може збільшитися.
READ UNCOMMITTED
також може змусити вас читати рядки двічі або пропускати цілі рядки . Якщо розбиття сторінки відбувається під час читання, ви можете пропустити цілі фрагменти даних. WITH(NOLOCK)
слід використовувати лише в тому випадку, якщо точність результатів не важлива
Це може бути корисно, щоб побачити хід довгих запитів вставки, зробити будь-які приблизні оцінки (наприклад, COUNT(*)
грубі SUM(*)
) тощо.
Іншими словами, результати, які повертаються брудними запитами для читання, є нормальними, якщо ви ставитесь до них як до оцінок і не приймаєте критичних рішень на їх основі.
Мій улюблений випадок використання - read uncommited
це налагодження чогось, що відбувається всередині транзакції.
Запустіть програмне забезпечення під налагоджувачем, поки ви переходите через рядки коду, він відкриває транзакцію та змінює вашу базу даних. Поки код зупиняється, ви можете відкрити аналізатор запитів, встановити на рівні читання, що не читається, і виконати запити, щоб побачити, що відбувається.
Ви також можете використовувати його, щоб побачити, чи тривалі процедури тривають або правильно оновлено вашу базу даних.
Чудово, якщо ваша компанія любить робити надмірно складні процедури, що зберігаються.
Перевага полягає в тому, що в деяких ситуаціях це може бути швидшим. Недоліком є те, що результат може бути неправильним (дані, які ще не здійснені, можна повернути), і немає гарантії того, що результат повторюється.
Якщо ви дбаєте про точність, не використовуйте це.
Більше інформації на MSDN :
Реалізує забруднене зчитування чи блокування рівня 0 ізоляції, що означає, що жодних загальних блокувань не видається і жодних ексклюзивних замків немає. Якщо цей параметр встановлений, можна прочитати невідомі або брудні дані; значення в даних можуть бути змінені, а рядки можуть з’являтися або зникати в наборі даних до закінчення транзакції. Цей параметр має той самий ефект, що і встановлення NOLOCK для всіх таблиць у всіх операторах SELECT транзакції. Це найменш обмежуючий з чотирьох рівнів ізоляції.
select
заяви не доведеться чекати, щоб отримати спільні блокування на ресурсах, які виключно заблоковані іншими транзакціями.
Коли це нормально використовувати READ UNCOMMITTED
?
Добре : великі сукупні звіти, що показують постійно змінюються підсумки.
Ризиково : майже все інше.
Хороша новина полягає в тому, що більшість звітів лише для читання належать до цієї категорії « Добре ».
Гаразд, щоб використовувати його:
Це стосується, мабуть, більшості того, що зробив би Департамент бізнес-аналітики у, скажімо, SSRS. Виняток, звичайно, є що-небудь із знаками $ перед ним. Багато людей приділяють гроші набагато більше старанності, ніж застосовують до відповідних основних показників, необхідних для обслуговування клієнта та отримання цих грошей. (Я звинувачую бухгалтерів).
Коли ризиковано
Будь-який звіт, що знижується до рівня деталізації. Якщо ця деталь потрібна, це зазвичай означає, що кожен рядок буде відповідним рішенню. Насправді, якщо ви не можете витягнути невелику підмножину без блокування, це може бути з тієї причини, що вона зараз редагується.
Історичні дані. Це рідко має практичну різницю, але хоча користувачі розуміють, що постійно змінюються дані не можуть бути ідеальними, вони не відчувають однакового стаціонарних даних. Брудні читання тут не зашкодять, але час від часу може бути подвійним читанням. Зважаючи на те, що у вас не повинно бути блоків на статичних даних, навіщо ризикувати?
Практично все, що живить додаток, який також має можливості запису.
Коли навіть ОК сценарій не в порядку.
NOLOCK
на цих таблицях нічого.read uncommitted
для веб-додатків, коли користувач бачить якусь сітку інтерфейсу користувача, де точність даних не так важлива. Користувач просто хоче короткий огляд, які записи можуть бути там, а може бути і з деякими підказками, сортуванням та фільтруванням. Тільки коли користувач натискає кнопку «Редагувати», я намагаюся прочитати найновіший запис із більш суворим рівнем ізоляції. Чи не повинен такий підхід бути кращим з точки зору продуктивності?
select item from things with (UPDLOCK)
. Поставте туди швидкий тайм-аут, щоб, якщо він не зміг швидко придбати блокування, він повідомить користувачеві, що його редагують. Це захистить вас не лише від користувачів, але і від розробників. Єдина проблема в тому, що ви повинні почати думати про очікування часу та про те, як ви впораєтесь із цим інтерфейсом.
Що стосується звітності, ми використовуємо її у всіх наших запитах звітування, щоб запобігти запиту баз даних. Ми можемо це зробити, оскільки ми витягуємо історичні дані, а не сучасні дані.
Використовуйте READ_UNCOMMITTED в ситуації, коли джерело малоймовірно змінити.
Не використовуйте READ_UNCOMMITTED, коли знаєте, що соус може змінитися під час роботи із завантаженням.
READ UNCOMMITTED
.
READ UNCOMMITTED
більшості ситуацій, коли ваші дані активно використовуються, і ви хочете зменшити навантаження на сервер, щоб уникнути можливих тупиків і відкатів транзакцій лише тому, що деякі користувачі, коли недбало зловживають " Оновити "на веб-сторінці із мережею даних. Користувачі, які переглядають купу записів одночасно, зазвичай не надто хвилюються, чи дані трохи застаріли або частково оновлені. Тільки тоді, коли користувач збирається редагувати запис, ви, можливо, захочете надати йому / їй найточніші дані.
Це дасть вам брудні читання та покаже транзакції, які ще не здійснені. Це найочевидніша відповідь. Я не думаю, що корисно використовувати це просто для прискорення читання. Є й інші способи зробити це, якщо ви використовуєте хороший дизайн бази даних.
Також цікаво відзначити, що не відбувається. ЧИТАЙТЕ НЕЗАБАВЛЕНО не ігнорує лише інші блоки таблиці. Це також не викликає жодних замків.
Подумайте, що ви створюєте великий звіт або переносите дані зі своєї бази даних, використовуючи великий і, можливо, складний оператор SELECT. Це призведе до загального блокування, яке може бути ескальоване до блокування спільної таблиці протягом тривалості транзакції. Інші транзакції можуть читатися з таблиці, але оновлення неможливо. Це може бути поганою ідеєю, якщо його виробнича база даних, оскільки виробництво може повністю припинитися.
Якщо ви використовуєте READ UNCOMMITTED, ви не встановите загальний замок на столі. Ви можете отримати результат від деяких нових транзакцій або не залежно від того, куди в нього було вставлено дані, і як довго читали вашу транзакцію SELECT. Ви також можете отримати однакові дані двічі, якщо, наприклад, відбудеться розкол сторінки (дані будуть скопійовані в інше місце у файлі даних).
Отже, якщо для вас дуже важливо, щоб дані можна було вставляти під час вибору SELECT, ЧИТАТИ НЕЗАКОМНО, це може мати сенс. Ви повинні врахувати, що ваш звіт може містити деякі помилки, але якщо його базується на мільйонах рядків і лише декілька з них оновлюється під час вибору результату, це може бути "досить хорошим". Ваша транзакція також може провалитися разом, оскільки унікальність рядка може бути не гарантована.
Кращим способом може бути використання рівня СНАПШОТІВ ІЗОЛЯЦІЇ, але для ваших програм можуть знадобитися деякі коригування. Одним із прикладів цього є те, якщо ваша програма робить ексклюзивний замок на ряду, щоб запобігти її читанню та переходу в режим редагування в інтерфейсі користувача. СНАПШОТ ІЗОЛЯЦІЙНИЙ РІВЕНЬ також поставляється зі значним покаранням продуктивності (особливо на диску). Але ви можете подолати це, кинувши обладнання на проблему. :)
Ви також можете розглянути можливість відновлення резервної копії бази даних для використання для звітування або завантаження даних у сховище даних.
Я завжди використовую "ЧИТАТИ НЕЗАКОМНО" зараз. Це швидко з найменшими проблемами. Під час використання інших ізоляцій ви майже завжди будете стикатися з деякими проблемами блокування.
Поки ви використовуєте поля автоматичного збільшення і приділяєте трохи більше уваги вставкам, ніж ваш штраф, і ви можете попрощатися з блокуванням проблем.
Ви можете помилитися з ЧИТАЙТЕ НЕЗАМЕЖЕНО, але якщо чесно, дуже просто переконайтеся, що ваші вставки є повним підтвердженням. Вставки / оновлення, які використовують результати вибору, - це лише те, на що потрібно стежити. (Використовуйте тут ПРОЧИТАНО ЗАВАНТАЖЕНО або переконайтесь, що брудні читання не спричинить проблеми)
Тож перейдіть на "Брудні читання" (спеціально для великих звітів), ваше програмне забезпечення буде працювати більш гладко ...
Committed
вставки та оновлення. Щодо інших проблем, він також продемонстрував обізнаність щодо розбиття сторінок, згадуючи використання ключа Авто-збільшення. Я погоджуюсь з ним, що майже вся реалізована репортаж, яку має читати просто людина, може допустити незначні розбіжності в остаточному десятковому знаку. Я погоджуюся, що це інша історія для детальних списків або даних, призначених для машинного зчитування та перетворення, як і Клайв.