Как можно добиться неконсистентного состояния данных

«Как можно добиться неконсистентного состояния данных» — вопрос из категории Базы данных, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Неконсистентное состояние данных возникает, когда операции чтения видят частично обновлённые или устаревшие данные. В Go это может произойти при:

  1. Отсутствии синхронизации при доступе к общим данным из нескольких горутин:
var counter int

func increment() {
    counter++ // Data race!
}

func main() {
    go increment()
    go increment()
}
  1. Неправильном порядке операций:
var a, b int

func update() {
    a = 1
    b = 2
}

func read() {
    fmt.Println(b) // Может увидеть 2, но a ещё 0
}
  1. Использовании неатомарных операций над сложными структурами данных.

  2. Отсутствии транзакционности при работе с БД или распределёнными системами.

  3. Гонках данных при конкурентном доступе без мьютексов/channels/atomic.