Поскольку базы данных SQL (например, MySQL, PostgreSQL, SQL Server) имеют блокирующие транзакции, как реализуется неблокирующий/реактивный транзакционный код.
Представьте этот транзакционный код, имитирующий проверку корзины покупок.
Код: Выделить всё
begin transaction
decrease stock of product A by 5 (#1)
decrease stock of product B by 2 (#2)
decrease wallet balance by $100 (#3)
insert into log that user has bought 5 product A (#4)
insert into log that user has bought 2 product B (#5)
if (wallet balance is less than $10) insert into needTopUp table (#6)
if (wallet balance is less than $50) insert into lowBalance table (#7)
commit transaction
Потенциальные проблемы
- На складе продукта А всего 2 шт., и вы можете' не должно быть отрицательного запаса.
- Баланс кошелька составляет всего 5 долларов США и не может стать отрицательным.
- Сбой сервера в №4, №5, №6 или №7. (без отката, но не будет зафиксировано)
- Темы по-прежнему должны соблюдать порядок, не так ли? то есть вы не можете вставить в таблицу lowBalance до уменьшения баланса кошелька. Но №1 и №2 можно делать параллельно. Как это указать в коде?
- Будет ли каждая задача представлять собой транзакцию сама по себе? Будет ли поток, выполняющий «уменьшение запаса», «начать транзакцию, уменьшить запас, зафиксировать»? Я бы так не думал, с тех пор как его можно будет откатить?
Подробнее здесь: https://stackoverflow.com/questions/789 ... a-non-bloc