Як пояснити блокування в базі даних англійською мовою
Дізнайтеся, як пояснити інцидент з блокуванням бази даних — дві транзакції, які блокують одна одну — простою англійською мовою для аудиторії, яка не володіє навичками керування базами даних, не спрощуючи або не занурюючи їх у жаргон.
Тупи справді заплутані, щоб пояснити, тому що основний механізм - дві речі, що чекають одна на одну таким чином, що ніколи не можуть вирішити самостійно - є абстрактним, і більшість аудиторій, які не є DBA, ніколи не мали роздумувати про блокування порядку раніше. Трик в англійській мові полягає в тому, щоб використовувати одну невелику, конкретну аналогію послідовно, а не перемикати між кількома, і бути точним щодо того, що база даних робить автоматично проти того, що людина повинна зробити.
Ключовий словник
** Заблокувати ** — механізм, який використовується базою даних для тимчасового запобігання зміни (або інколи читання) частини даних іншими транзакціями, коли одна транзакция працює з цими даними. Цей механізм існує для того, щоб зберегти послідовність даних під час одночасного доступу.
- “Транзакція A отримала блокування рядка замовлень під час оновлення кількості запасів, що є абсолютно нормально — проблема виникає лише тоді, коли друга транзакція також потребує блокування, яке має транзакція A, і навпаки.” *
** Кільцеподібне очікування ** — особлива умова, яка спричиняє затримку: транзакція A очікує на блокування, яке здійснює транзакція B, у той час як B одночасно очікує на блокування, яке здійснює A, отже, жодна з цих операцій не може продовжувати роботу. “Це було класичне кругове очікування: транзакція А заблокувала таблицю замовлень і чекала на запаси, в той час як транзакція Б заблокувала запаси і чекала на замовлення — кожна блокувала саме те, що потрібно іншій.”
** Визначення застою ** — автоматичний механізм бази даних для визначення циклічного очікування і розв’ язання цього застою за допомогою примусового завершення однієї з транзакцій, що є вбудованим механізмом безпеки, а не помилкою бази даних. “Виявлення застою бази даних зробило саме те, що було призначено: він визначив циклічне очікування після приблизно 400 мілісекунд і вбив одну з двох транзакцій, щоб інша могла продовжувати.”
** Victim transaction ** — певна транзакція, яку база даних вирішила припинити, щоб розв’ язати затримку, після чого програма має повторити спробу, ідеально, автоматично.
- “Транзакцію B було обрано як жертву транзакції і відкинуто автоматично. Програма повинна спробувати його знову, але в цьому випадку логіка повторних спроб мала помилку і беззвучно відкинула невдалу транзакцію замість цього — це фактичний інцидент, а не сам затор.”*
Звичайні фрази
- «Цей інцидент був викликаний застоєм — дві транзакції чекали на замок, який тримав інший»
- Це називається циклічною чергою: транзакція A потребувала того, що B мала, і B потребувала того, що A мала, в той же час
- «Виявлення застою бази даних обробляло це автоматично, як було спроектовано, закінчуючи одну з транзакцій»
- «Справжня проблема була не сама затримка — це очікувалося і оброблялося — це було те, що наша логіка повторних спроб для жертви транзакції мала баґу»
- «Ми змінюємо порядок, в якому ці дві операції отримують замки, що повністю виключає можливість цього конкретного циклічного очікування»
Приклади висловлювань
Пояснюючи основний механізм за допомогою простої аналогії, раз, і тримаючись її:
- “Уявіть, що дві людини намагаються пройти через дві двері одночасно, кожна блокує двері, через які має пройти інша - жодна не може рухатися вперед, і жодна не відступить сама. Це те, що сталося між цими двома операціями.»*
Прояснюю, що сам затор не був вада:
- “Для зрозумілості, затримка не є вада — бази даних розроблені для виявлення цієї ситуації і автоматичного розв’ язання її за мілісекунди. Це трапляється регулярно під одночасною нагрузкою. Справжня проблема була нижче за те.»*
Описуючи справжню причину точно:
- “База даних правильно визначила циклічне очікування і відновила транзакцію жертви, як було заплановано. Вада була в нашій програмі: логіка повторних спроб для поверненої транзакції безмовно проковтнула помилку замість повторних спроб, через що оновлення було втрачено.”*
Професійні поради
- Введіть поняття ** замку ** перед тим, як використовувати слово « замкнутий замок » — перехід прямо до « замкнутий замок » без встановлення того, що це замок, залишає нетехнічні читачі вгадувати весь інший час пояснення.
- Описати ** кругове очікування ** за допомогою однієї конкретної, фізичної аналогії — наприклад, двох дверей — і повторно використовувати ту ж аналогію протягом пояснення, а не перемикатися метафорами посередині, що має тенденцію заплутати більше, ніж це пояснює.
- Явно вкажіть, що ** виявлення застою ** очікується, автоматична поведінка, а не невдача - це одне речення зазвичай запобігає хвилі «чому це сталося» подальших питань від зацікавлених сторін, які припускають, що будь-яка аномалія бази даних повинна бути помилкою.
- Відстежувати, що насправді сталося з ** жертвою транзакції ** після її завершення — це дуже часто місце, де відбувається справжній інцидент, оскільки сам затор обробляється автоматично, але відповідь програми на нього може бути не автоматичною.
- Закрити з конкретним виправленням — зазвичай зміна порядку придбання замків — зазначена в одному реченні, що не є DBA, може повторюватися, оскільки «ми переупорядкували, як ці дві операції придбали замки» зрозуміло навіть без глибоких знань про базу даних.
Практичні вправи
- Поясніть, що таке замок, у одному реченні, яке підійде для нетехнічної аудиторії, не використовуючи слово « замок ».
- Описати циклічне очікування між двома гіпотетичними транзакціями за допомогою єдиної послідовної аналогії.
- Напишіть два речення, які відрізняють автоматичне оброблення застою бази даних від окремої помилки на рівні програми у логіці повторення спроби.
Розробка навігаційних систем з використанням навігаційних систем
Застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати застосовувати Ключ не просто описує * що * сталося - пара транзакцій, що тримають несумісні замки - але обрамляє це в контексті роботи, яку вони робили і потенційного впливу. Задумайтеся, як би ви пояснили затримку або проблему комусь, кому потрібно швидко зрозуміти наслідки, а не втрачатися у технічних деталях.
Розглянемо реалістичний сценарій: Сара працює над оновленням адрес клієнтів в нашій системі електронної комерції, в той час як Марк одночасно обробляє замовлення, які вимагають доступу до тих самих записів адрес. Рушій бази даних виявляє, що обидві транзакції намагаються отримати доступ до одного набору рядків — скажімо, всі адреси доставки для клієнтів з прізвищами « Сміт » — і входить у стан застою. Типовий звіт DBA може бути заповнений такими термінами, як « суперечка щодо ресурсів », « ескалація блокування » і коди помилок SQL. Натомість, ми можемо перекласти це на щось більш зрозуміле.
Я написав повідомлення Slack менеджеру проекту, Девіду: «Гей, Девід, швидке оновлення - ми зіткнулися з тимчасовим уповільненням в обробці замовлення. Похоже, Сара обновляла адреса клиентов, а Марк обрабатывал заказы, используя те же самые адресные записи. Система виявила затор — по суті, обидві транзакції чекали один на одного, щоб звільнити замки на даних. Ми вирішили це, відкинувши зміни Сари і повторивши дії. Це підкреслює важливість координації цих типів оновлень, щоб зменшити потенційні конфлікти. » Зауважте, що я уникнув технічного жаргону і зосередив увагу на * ефекті * — уповільненні обробки — і на кореневій причині — конфліктних оновленнях.
Під час надання зворотнього зв’ язку щодо запиту на завантаження, який вводить зміну, що впливає на спільні ресурси, можна використовувати подібний підхід. Замість того, щоб сказати « Запит спричиняє потенційний сценарій застою », спробуйте сказати: « Це оновлення даних адреси клієнта може призвести до конфлікту, якщо інший процес також змінює ці записи одночасно. Ми повинні впровадити такі заходи безпеки, як оптимістичні рівні блокування або ізоляції транзакцій, щоб запобігти цьому. ” Знову ж таки, зосередження уваги на ризику і запропонування рішення демонструє розуміння ширших наслідків, які виходять за рамки лише технічних деталей. Метою завжди є повідомлення про вплив проблеми і заохочення проактивних рішень - а не просто діагностування проблеми.