Як правильно реалізувати оптимістичне блокування в MySQL?
Наша команда зробила висновок, що ми повинні зробити №4 нижче, інакше є ризик, що інший потік може оновити ту саму версію запису, але ми хотіли б підтвердити, що це найкращий спосіб зробити це.
- Створіть поле таблиці на таблиці, для якої слід використовувати оптимістичне блокування, наприклад, наприклад, ім'я стовпця = "версія"
- У розділі "Вибір" обов'язково додайте стовпець версії та занотуйте версію
- Після наступного оновлення запису оператор оновлення повинен видавати "де версія = X", де X - версія, яку ми отримали у №2, і встановити поле версії під час цього оператора оновлення на X + 1
- Виконайте
SELECT FOR UPDATE
запис, який ми збираємось оновити, щоб ми серіалізували, хто може вносити зміни до запису, який ми намагаємось оновити.
Для уточнення ми намагаємося не допустити, щоб два потоки, які вибирають одну і ту ж запис у тому ж часовому вікні, де вони захоплюють одну й ту саму версію запису, не перезаписували б один одного, якщо вони намагались би одночасно спробувати оновити запис. Ми вважаємо, що якщо ми не зробимо №4, існує ймовірність, що якщо обидва потоки одночасно введуть відповідні транзакції (але ще не опублікували оновлення), коли вони перейдуть на оновлення, другий потік, який використовуватиме ОНОВЛЕННЯ ... де версія = X буде працювати на старих даних.
Чи правильно ми думаємо, що ми повинні робити це песимістичне блокування під час оновлення, навіть якщо ми використовуємо поля версії / оптимістичне блокування?
SELECT ... FOR UPDATE
або оптимістичним замок через підрядник управління версіями, але з обидва. Дивіться детально у відповідь.