> Как избежать race condition при одновременном чтении и записи в таблицу транзакций в Go (Go)
Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы
Компании: Employcity
Стек: Go
> Пример ответа
Для предотвращения race condition при работе с таблицей транзакций в Go можно использовать несколько подходов. Самый простой - мьютекс (sync.Mutex), который блокирует доступ к данным при записи и чтении:
GOtype TransactionTable struct {mu sync.Mutexdata map[string]int64}func (t *TransactionTable) Write(key string, value int64) {t.mu.Lock()defer t.mu.Unlock()t.data[key] = value}func (t *TransactionTable) Read(key string) (int64, bool) {t.mu.Lock()defer t.mu.Unlock()val, ok := t.data[key]return val, ok}
Для сценариев с частым чтением и редкой записью эффективнее sync.RWMutex - он позволяет параллельное чтение, но блокирует запись:
GOtype TransactionTable struct {mu sync.RWMutexdata map[string]int64}func (t *TransactionTable) Read(key string) (int64, bool) {t.mu.RLock()defer t.mu.RUnlock()val, ok := t.data[key]return val, ok}
Если требуется атомарная операция "прочитать-изменить-записать" (например, обновление баланса), используйте sync/atomic или каналы для последовательной обработки. Для высоконагруженных систем рассмотрите паттерн "один писатель - много читателей" через каналы: горутина-писатель принимает запросы через канал, а читатели получают снимки данных через отдельный канал или с помощью sync.Map.
Важно: при работе с БД (PostgreSQL, MySQL) используйте транзакции с уровнем изоляции SERIALIZABLE или REPEATABLE READ и оптимистичные блокировки (версионирование строк).
> Похожие задачи по Go
Когда логирование хорошо использовать, а когда лучше не использовать
Для чего нужно логирование
Что такое кардинальность колонок и зачем это знать
Можно ли отключить или ограничить запуск сборщика мусора в Go
> Похожие задачи по backend
Когда логирование хорошо использовать, а когда лучше не использовать
Для чего нужно логирование
Что такое кардинальность колонок и зачем это знать
Можно ли отключить или ограничить запуск сборщика мусора в Go
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью