Введення оператора Select в транзакцію


10

Яка різниця між цими двома запитами:

START TRANSACTION;
SELECT * FROM orders WHERE id=1;
UPDATE orders SET username='John' WHERE id=1;
COMMIT;

І без угоди:

SELECT * FROM orders WHERE id=1;
UPDATE orders SET username='John' WHERE id=1;  

Який ефект має SELECTвнутрішня транзакція?

Якщо DELETE FROM orders WHERE id=1виклик з іншого сеансу відразу після SELECTобох випадків, коли він буде оброблений?

Відповіді:


5

SELECT запит всередині транзакції, сам по собі, не захищений належним чином від UPDATE та DELETE.

Що потрібно використовувати наступне:

Якщо ви опублікуєте Delete From orders Where id=1це, це станеться, коли рядки в ordersтаблиці звільнять свої блокування в кінці транзакції. Ви можете поекспериментувати (на сервісі Dev / Staging, будь ласка), використовуючи READ UNCOMMITTEDрівень ізоляції транзакцій, щоб видалити видалення логічно, але лише після фіксації воно стане видимим і записане назавжди.

У другій транзакції, в основному, всі ставки знімаються. Якщо ти біжиш

select * From orders Where id=1;
UPDATE orders SET username="John" Where id=1;

біг Delete From orders Where id=1здійсниться негайно. Залежно від порядку, яким MySQL виконує ці операції, ви побачите (чи не бачите) рядки видалення.

КАВАТИ

MySQL 5.6 має таке :

  • START TRANSACTION READ WRITE;
  • START TRANSACTION READ ONLY;

Модифікатори READ WRITE і READ ONLY встановлюють режим доступу до транзакцій. Вони дозволяють або забороняють зміни таблиць, що використовуються в транзакції. Обмеження «ЧИТАТИ ТІЛЬКИ» запобігає транзакції змінювати або блокувати як транзакційні, так і нетранзакційні таблиці, видимі для інших транзакцій; транзакція все ще може змінювати або блокувати тимчасові таблиці. Ці модифікатори доступні на MySQL 5.6.5.

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