Я хочу преобразовать следующий - по общему мнению, плохой - запрос из H2 / MySQL в Postgres / cockroach:
SET @UPDATE_TRANSFER=
(select count(*) from transfer where id=‘+transfer_id+' and consumed=false)>0;
update balance_address set balance =
case when @UPDATE_TRANSFER then balance +
(select value from transaction where transfer_id=‘+id+' and t_index=0)
else balance end where address =
(select address from transaction where transfer_id=‘+id+' and t_index=0)
В этом запросе участвуют три таблицы: balance_address , связка и транзакция .Целью запроса является обновление общего баланса, когда происходит перевод средств.
В перевод может быть включено много транзакций.Например, предположим, что у Пола есть 20 долларов на его счету, и он хочет послать 3 доллара Джейн.Это приведет к 4 транзакциям: та, которая добавляет 3 доллара на счет Джейн. Одна транзакция, которая удаляет 20 долларов со счета Пола. Одна транзакция, которая заменяет счет Пола на 0. Одна транзакция, которая переводит остаток средств Пола в новый адрес;все еще принадлежит ему.
Каждая из этих транзакций во всем пакете передачи имеет индекс и значение.Как вы видите выше.Таким образом, цель этого запроса на обновление состоит в том, чтобы обновить учетную запись Джейн.
Сложность заключается в том, что эта передача может обрабатываться многими серверами параллельно, и распределенная блокировка отсутствует.Таким образом, если мы наивно обрабатываем параллельно, каждый сервер будет увеличивать учетную запись Джейн, что приводит к ошибочным результатам.
Чтобы предотвратить это, в таблице balance_address есть столбец с именем потребляемый.Первый сервер, который обновляет баланс, устанавливает для передачи значение = истина.Другие серверы или потоки могут обновляться только в том случае, если для потребителя задано значение false.
Итак, моя цель: 1) улучшить этот запрос и 2) переписать его для работы с постерами.Прямо сейчас, переменная конструкция уже не принята.
PS.Я не могу изменить модель данных.