фантомное, грязное чтение и подобное
Для решения я открывал параллельные соединения с БД
Это не связанные друг с другом вещи. То что вы описали возникает при транзакциях, я знаю два способа пофиксить это. Первый - использовать FOR UPDATE/LOCK TABLE, в запросах, который будет ждать пока выполняется другая транзакция. Второй использовать serializable и политику ретраев.
Использовал уровень изоляции serializable
Он защищает от ошибок с транзакциями, и по сути просто отменяет их в случае ошибок и показывает что была попытка неправильно использовать транзакцию, исправить ошибки в транзакциях он не может.
На форумах пишут "нужно грамотно управлять пулами соединений", но что это значит? Где про это прочитать?
Лучше там спросить, что они имеют ввиду.
И я убрал параллельные соединения и сделал транзакции через основное соединение с БД (то, которое при запуске открывается и больше не закрывается), и это заработало, но теперь так как соединение одно, каждый юзер вынужден ждать завершения транзакций всех остальных юзеров.
Как бы пользователь в любом случае должен ждать пока другие транзакции завершатся, пул соединений полезен тем, что другие запросы не связанные с этой таблицей могу параллельно выполняться.
Если вы используете транзакции, по хорошему это нужно нормально тестировать, в тесте быстро запускать 100-150 транзакций, которы едолжны выполниться без ошибок и при этом вы должны получить желаемый результат в БД после их выполнения.