Блокування таблиць не дозволяє іншим користувачам БД впливати на рядки / таблиці, які ви заблокували. Але самі замки НЕ БУДЬ забезпечити, щоб ваша логіка виходила в послідовний стан.
Подумайте про банківську систему. Коли ви оплачуєте рахунок в Інтернеті, є щонайменше два рахунки, на які впливає транзакція: Ваш рахунок, з якого беруться гроші. І рахунок одержувача, на який перераховуються гроші. І рахунок банку, на який вони з радістю здадуть усі збори за послуги, стягнуті за транзакцію. Враховуючи (як всім відомо в ці дні), що банки надзвичайно дурні, скажімо, їх система працює так:
$balance = "GET BALANCE FROM your ACCOUNT";
if ($balance < $amount_being_paid) {
charge_huge_overdraft_fees();
}
$balance = $balance - $amount_being paid;
UPDATE your ACCOUNT SET BALANCE = $balance;
$balance = "GET BALANCE FROM receiver ACCOUNT"
charge_insane_transaction_fee();
$balance = $balance + $amount_being_paid
UPDATE receiver ACCOUNT SET BALANCE = $balance
Тепер, без блокування та жодних транзакцій, ця система є вразливою до різних перегонових умов, найбільшою з яких є багаторазові платежі на ваш рахунок або паралельно на рахунку одержувача. Хоча ваш код отриманий баланс і робить величезні_overdraft_fees () і багато чого іншого, цілком можливо, що якийсь інший платіж буде виконувати паралельно той же тип коду паралельно. Вони отримають ваш баланс (скажімо, 100 доларів США), здійснюватимуть свої операції (беруть 20 доларів, які ви платите, і 30 доларів, які вони вам перекручують), і тепер обидва шляхи коду мають два різних залишки: 80 доларів США та 70 доларів. Залежно від того, який із останніх закінчується, ви отримаєте будь-який із цих двох залишків на своєму рахунку, замість 50 доларів, які ви мали б закінчити ($ 100 - $ 20 - $ 30). У цьому випадку "банківська помилка на вашу користь"
Тепер, скажімо, ви користуєтеся замками. Платіж за ваш рахунок (20 доларів) спочатку потрапляє в трубку, тому він виграє і записує запис вашого рахунку. Тепер ви отримали ексклюзивне використання і можете вирахувати з залишку 20 доларів, і спокійно написати новий баланс ... і ваш рахунок закінчиться 80 доларів, як очікувалося. Але ... ух ... Ви намагаєтесь оновити обліковий запис одержувача, і він заблокований та заблокований довше, ніж дозволяє код, тамінуючи транзакцію ... Ми маємо справу з дурними банками, тому замість правильної помилки керування, код просто тягне exit()
, і ваші 20 доларів зникають у пухирці електронів. Тепер у вас немає 20 доларів, а ви все ще зобов'язані 20 доларів одержувачу, і ваш телефон повернеться у власність.
Отже ... укладайте транзакції. Ви починаєте транзакцію, дебетуєте з свого рахунку 20 доларів, намагаєтесь отримати кредит у 20-доларовому… і щось знову підірветься. Але цього разу замість exit()
цього коду можна просто зайнятись rollback
, і ваші 20 доларів чарівно додаються до вашого рахунку.
Зрештою, це зводиться до цього:
Замки не дозволяють комусь заважати записам баз даних, з якими ви маєте справу. Операції запобігають виникненню будь-яких «пізніших» помилок від втручання у «попередні» речі, які ви робили. Ні одне не може гарантувати, що в кінцевому підсумку все вийде нормально. Але разом вони роблять.
на завтрашньому уроці: Радість із тупиків.