> Как избежать race condition при одновременном чтении и записи в таблицу транзакций в Go (Go)

Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: Employcity

Стек: Go

> Пример ответа

Для предотвращения race condition при работе с таблицей транзакций в Go можно использовать несколько подходов. Самый простой - мьютекс (sync.Mutex), который блокирует доступ к данным при записи и чтении:

GO
type TransactionTable struct {
mu sync.Mutex
data 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 - он позволяет параллельное чтение, но блокирует запись:

GO
type TransactionTable struct {
mu sync.RWMutex
data 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 и оптимистичные блокировки (версионирование строк).

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью