вторник, 7 сентября 2021 г.

Отмена незавершенных операций с базой данных в Golang

Вы можете управлять незавершенными операциями с помощью Go context.Context. Контекст - это стандартное значение данных Go, которое может сообщать, была ли общая операция, которую он представляет, отменена и больше не нужна. Передавая context.Context между вызовами функций и сервисами в вашем приложении, они могут перестать работать раньше и возвращать ошибку, когда их обработка больше не требуется.

Например, вы можете захотеть:

  • Завершить длительные операции, включая операции с базой данных, выполнение которых занимает слишком много времени.
  • Распространять запросы на отмену из других источников, например, когда клиент закрывает соединение.

Многие API-интерфейсы для разработчиков Go включают методы, которые принимают аргумент Context, что упрощает использование контекста во всем приложении.

Отмена операций с базой данных после таймаута

Вы можете использовать контекст, чтобы установить таймаут или крайний срок, по истечении которого операция будет отменена. Чтобы получить контекст с таймаутом или крайним сроком, вызовите context.WithTimeout или context.WithDeadline.

Код в следующем примере таймаута извлекает контекст и передает его в метод sql.DB QueryContext.

func QueryWithTimeout(ctx context.Context) {
    // Создаем Context с таймаутом.
    queryCtx, cancel := context.WithTimeout(ctx, 5*time.Second)
    defer cancel()

    // Передаем Context с таймаутом с запросом.
    rows, err := db.QueryContext(queryCtx, "SELECT * FROM album")
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close()

    // Обрабатываем возвращенные строки.
}

Когда один контекст является производным от внешнего контекста, поскольку queryCtx является производным от ctx в этом примере, если внешний контекст отменяется, то производный контекст также автоматически отменяется. Например, в HTTP-серверах метод http.Request.Context возвращает контекст, связанный с запросом. Этот контекст отменяется, если HTTP-клиент отключает или отменяет HTTP-запрос (возможно в HTTP/2). Передача контекста HTTP-запроса в QueryWithTimeout выше приведет к преждевременной остановке запроса к базе данных либо в том случае, если общий HTTP-запрос был отменен, либо если запрос занял более пяти секунд.

Примечание. Всегда откладывайте (defer) вызов функции отмены, которая возвращается при создании нового контекста с таймаутом или крайним сроком. Это освобождает ресурсы, удерживаемые новым контекстом, при выходе из содержащей его функции. Он также отменяет queryCtx, но к тому времени, когда функция вернется, уже ничто не должно использовать queryCtx.


Читайте также:


Купить gopher

Комментариев нет:

Отправить комментарий