Как в 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;
но увы это совсем не помогло.
Как по умолчанию в таблице блокировать строку на чтение и запись, когда эта строка занята чтением или записью?