Есть два компонента, которые следует учитывать при этом:
Потокобезопасность клиента go language
Первый требует аудит , надеюсь, эту информацию легко найти в сообществе без необходимости углубляться в аудиты на уровне кода. Я вижу, что безопасность параллельных (потоков) упомянута для ряда абстракций в официальной документации go , поэтому должно быть легко определить, какие структуры и методы безопасны для одновременного использования с точки зрения языкового уровня (go ).
Уровни изоляции транзакций базы данных
Второе - рассмотрение вопроса о том, как начать входить в базу данных, и гарантии, которые предлагает ваша конкретная БД (и просто общее удовольствие от распределенных систем :)). Уровень изоляции по умолчанию для postgres / mysql допускает 2 одновременных чтения, чтобы увидеть одни и те же данные, и тогда пусть каждый перезаписывает другой (при записи).
Документация postgres предоставляет отличный пример этого случая :
Из-за вышеприведенного правила команда обновления может
увидеть противоречивый снимок: он может видеть эффекты одновременного
Обновление команд в тех же строках, которые он пытается обновить, но это
не видеть влияние этих команд на другие строки в базе данных. это
Такое поведение делает режим Read Committed неподходящим для команд, которые
включать сложные условия поиска; однако, это как раз для
более простые случаи. Например, рассмотрите возможность обновления банковских балансов с помощью
транзакции типа:
BEGIN;
UPDATE accounts SET balance = balance + 100.00 WHERE acctnum = 12345;
UPDATE accounts SET balance = balance - 100.00 WHERE acctnum = 7534;
COMMIT;
Если две такие транзакции одновременно пытаются изменить баланс
счет 12345, мы явно хотим, чтобы вторая транзакция началась с
обновленная версия строки аккаунта. Потому что каждая команда
затрагивает только предопределенную строку, позволяя ей видеть обновленную версию
строки не создает неприятных противоречий.