База данных SQL (например, MySQL, PostgreSQL, SQL Server) блокируется. Как реализуется неблокирующая транзакционная струJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 База данных SQL (например, MySQL, PostgreSQL, SQL Server) блокируется. Как реализуется неблокирующая транзакционная стру

Сообщение Anonymous »

Я хотел бы понять, как реализовано что-то вроде ReactiveTransactional от Quarkus.
Поскольку базы данных 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
При обычном императивном (блокирующем) стиле вы ждете завершения каждого из этих шагов и при возникновении проблем выполняете откат. На территории Java это находится в 1 теме.
Потенциальные проблемы
  • На складе продукта А всего 2 шт., и вы можете' не должно быть отрицательного запаса.
  • Баланс кошелька составляет всего 5 долларов США и не может стать отрицательным.
  • Сбой сервера в №4, №5, №6 или №7. (без отката, но не будет зафиксировано)
Как в этом случае работает стиль реактивных транзакций (например, ReactiveTransactional от Quarkus).
  • Темы по-прежнему должны соблюдать порядок, не так ли? то есть вы не можете вставить в таблицу lowBalance до уменьшения баланса кошелька. Но №1 и №2 можно делать параллельно. Как это указать в коде?
  • Будет ли каждая задача представлять собой транзакцию сама по себе? Будет ли поток, выполняющий «уменьшение запаса», «начать транзакцию, уменьшить запас, зафиксировать»? Я бы так не думал, с тех пор как его можно будет откатить?
Или Quarkus просто имеет в виду потоки в Java являются реактивными/неблокирующими, однако в базе данных они все еще блокируются (1 поток базы данных), если это так, то это имеет смысл. Но какой в ​​этом смысл, если он все еще блокируется на стороне базы данных.

Подробнее здесь: https://stackoverflow.com/questions/789 ... a-non-bloc
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»