Безопасны ли многопоточные транзакции базы данных через пул соединений? - PullRequest
3 голосов
/ 10 марта 2019

Пример сценария:

Использование пула потоков в Java, где каждый поток получает новое соединение из пула соединений, а затем все потоки выполняют параллельную транзакцию БД.Например, вставка 100 значений в одну и ту же таблицу.

Будет ли это как-то портить таблицу / базу данных или это абсолютно безопасно без какой-либо синхронизации, необходимой между потоками?


Мне трудно найти достоверную информацию по этому вопросу.Из того, что я собираю, движки БД обрабатывают это самостоятельно / если вообще (PostgresQL, очевидно, начиная с версии 9.X).Есть ли хорошо написанные статьи, объясняющие это далее?

Дополнительный вопрос: есть ли смысл использовать параллельные транзакции, когда БД работает на одном жестком диске?

1 Ответ

1 голос
/ 10 марта 2019

Пока сама база данных соответствует ACID , у вас все хорошо (хотя время от времени кто-то находит ошибку в какой-то действительно странной ситуации).

К вопросу о бонусе:для PostgreSQL это вполне имеет смысл, если у вас есть время для сбора параллельных транзакций (увеличьте значение для commit_delay ), что поможет объединить дисковые операции ввода-вывода в пакеты.Существуют и другие параметры для настройки пропускной способности транзакций, большинство из которых могут быть довольно опасными, если одной из ваших главных проблем является D .

Кроме того, имейте в виду, что клиент базы данных такженеобходимо выполнить некоторую работу между вызовами базы данных, которая при последовательном выполнении просто добавит время простоя для базы данных.Так что даже здесь, параллелизм помогает (пока у вас есть реальные ресурсы для этого (CPU, ...).

...