Уровни изоляции транзакций в PostgreSQL
Answer from AI
sobes.tech AI
PostgreSQL поддерживает четыре стандартных уровня изоляции транзакций, определённых в SQL стандарте:
-
Read Uncommitted — самый низкий уровень изоляции. В PostgreSQL фактически ведёт себя как Read Committed, так как не допускает грязных чтений.
-
Read Committed (по умолчанию) — транзакция видит только те данные, которые были зафиксированы на момент начала каждого отдельного запроса. Возможны неповторяющиеся чтения (non-repeatable reads) и фантомные чтения.
-
Repeatable Read — транзакция видит данные такими, какими они были на момент начала транзакции. Гарантирует повторяемое чтение, но возможны фантомные чтения.
-
Serializable — самый высокий уровень изоляции, обеспечивает полную сериализацию транзакций, предотвращая фантомные чтения и обеспечивая консистентность данных, как если бы транзакции выполнялись последовательно.
Пример установки уровня изоляции в Go с использованием database/sql и pq драйвера:
import (
"database/sql"
_ "github.com/lib/pq"
)
func setIsolationLevel(db *sql.DB) error {
tx, err := db.Begin()
if err != nil {
return err
}
defer tx.Rollback()
// Установка уровня изоляции
_, err = tx.Exec("SET TRANSACTION ISOLATION LEVEL SERIALIZABLE")
if err != nil {
return err
}
// Дальнейшие операции в транзакции
return tx.Commit()
}