Проблема: два параллельных запроса могут одновременно проверить данные и принять несовместимые решения. Например, каждый активирует свой кошелек — в результате активных окажется два. Одна транзакция сама по себе такую гонку не исключает.
Решение: перед изменением оба запроса берут один и тот же именованный lock. Первый выполняет операцию, второй ждёт. Разные ключи позволяют выполнять независимые операции параллельно.
await db.transaction(async tx => {
const lockKey = `wallets:trader:${chainKey}`;