Как в PostgreSQL заблокировать возможность читать и записывать данные если чтение или запись уже идёт

Есть 2 бота и одна БД. Один бот основной, второй дополнение. Возникла проблема, если в основном боте пользователь совершает действие с данными в таблице X и параллельно совершит действие в дополнительном боте с данными в таблице X, то данные могут не сохраниться. Пример. Имеем: Y=100, B=0. Основной бот отнимает от переменной Y - 100, дополнительный бот отнимает от переменной Y - 100 и прибавляет к переменной B + 100 (всё это происходит в один момент). Получаем что Y так и осталась 100, а B получила значение 100. Результат: Y=100, B=100 хотя должно быть Y=0, B=100.

Рассматривал такое решение. При получении данных из таблицы ставить блокировку get_x = "SELECT x FROM table WHERE id=%s FOR SHARE" это вроде даже помогло, но надеюсь есть решение проще, т.к. этот вариант требует внести огромное кол-во правок в коде.

Вторым решением было присвоить уровень блокировки всем таблицам.

BEGIN;
LOCK TABLE table IN SHARE ROW EXCLUSIVE MODE;

но увы это совсем не помогло.

Как по умолчанию в таблице блокировать строку на чтение и запись, когда эта строка занята чтением или записью?


Ответы (0 шт):