Безопасный параллелизм доступа к базе данных в Голанге - PullRequest
1 голос
/ 28 июня 2019

Мне нужны рекомендации по работе с базой данных параллелизма.Например, у меня есть база данных с информацией об оплате.Как я могу получить фактическую информацию о платежах, если у него более одного соединения, которое постоянно обновляет базу данных?

Я пытался использовать транзакцию с gorm, но я не уверен, работает ли она или нет.Также я пытаюсь использовать мьютекс, но если в моем приложении более 1 экземпляра, это не будет работать правильно.Также я пытаюсь использовать sql, как Обновление платежного набора someinfo = someinfo ||"дополнительная информация", где какое-то условие.

1 Ответ

2 голосов
/ 28 июня 2019

Есть два компонента, которые следует учитывать при этом:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...