Что такое сериализация параллельных операций
Что проверяют
Понимаете ли вы, что параллельность и корректность это разные свойства, и умеете ли сводить конкурентный доступ к предсказуемому порядку. В Go вопрос сразу двухслойный: синхронизация горутин в процессе и уровень изоляции в базе.
Как отвечать
Сериализация это приведение конкурентных операций к результату, эквивалентному какому-то последовательному порядку. Формулировка важна: не «выполняются по очереди», а «результат такой, как если бы выполнялись по очереди». Физически операции идут одновременно, ограничиваются только конфликтующие.
В процессе есть три инструмента. Мьютекс вокруг общего состояния. Один владелец данных и канал для запросов к нему, то есть обмен сообщениями вместо разделяемой памяти. Атомики для счётчиков и флагов.
func (c *Counter) Inc(k string) {
c.mu.Lock()
defer c.mu.Unlock()
c.n[k]++
}В базе за то же отвечает уровень изоляции. В PostgreSQL SERIALIZABLE реализован оптимистично: конфликтующая транзакция не ждёт, а завершается ошибкой сериализации с кодом 40001, и приложение обязано повторить её целиком. Значит в Go нужна обёртка с ретраями, а бизнес-логика внутри транзакции должна быть идемпотентной.
Где спотыкаются
Говорят, что сериализуемость означает выполнение транзакций по очереди, и делают вывод о катастрофическом падении пропускной способности. Это меняет и выбор уровня изоляции, и ожидания по нагрузке.
Берут под мьютексом только запись. Чтение map или среза без блокировки это такая же гонка, просто она ловится реже. Прогон тестов с флагом race обязателен, иначе дефект уедет в прод и проявится под нагрузкой.
Не обрабатывают ошибку сериализации в базе. Код ждёт, что транзакция либо применилась, либо упала навсегда, и при первом же конфликте пользователь получает ошибку вместо прозрачного повтора.