Демоны танцуют на разных уровнях изоляции | Всеобъемлющее руководство по SQL 10: Транзакции (6) Разъясните, как просматривать и устанавливать уровни изоляции в PostgreSQL | Проблемы, обновленные в августе

база данных PostgreSQL
Демоны танцуют на разных уровнях изоляции | Всеобъемлющее руководство по SQL 10: Транзакции (6) Разъясните, как просматривать и устанавливать уровни изоляции в PostgreSQL | Проблемы, обновленные в августе

Уровень изоляции PostgreSQL по умолчанию — чтение-фиксация (RC). В PostgreSQL внутри реализованы только три различных уровня изоляции.Если уровень изоляции установлен на «чтение неподтвержденных», его поведение точно такое же, как при чтении фиксации, то есть PostgreSQL не реализует чтение незафиксированных данных.

Давайте посмотрим, как просмотреть и установить уровень изоляции PostgreSQL.

Просмотр уровня изоляции PostgreSQL

Способ 1. Просмотр уровня изоляции по умолчанию

Проверьте уровни изоляции по умолчанию:show default_transaction_isolation;

postgres=# show default_transaction_isolation;
 default_transaction_isolation
-------------------------------
 read committed
(1 行记录)

Способ 2: просмотр уровня изоляции по умолчанию

Может быть настроен из таблицы конфигурации системы PGpg_settingsПросмотрите уровень изоляции по умолчанию в

postgres=# SELECT name, setting FROM pg_settings WHERE name = 'default_transaction_isolation';
             name              |    setting
-------------------------------+----------------
 default_transaction_isolation | read committed
(1 行记录)

Просмотр уровня изоляции текущего сеанса

Просмотр уровня изоляции текущего сеанса (соединения):

  • show transaction_isolation;
  • илиSELECT current_setting('transaction_isolation');
postgres=# show transaction_isolation;
 transaction_isolation
-----------------------
 read committed
(1 行记录)

Настроить уровень изоляции PostgreSQL

Установите уровень изоляции текущей транзакции (может быть изменен только в блоке транзакции)

В PostgreSQL,SET TRANSACTIONМожет использоваться для изменения уровня изоляции транзакции. Но его можно использовать только в блоках транзакций (transaction blocks) выполняется.

SET TRANSACTION ISOLATION LEVEL [ SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED ];

Измените уровень изоляции PgSQL следующим образом:

postgres=# SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
警告:  SET TRANSACTION 只能在事务块中使用
SET
postgres=# begin transaction;
BEGIN
postgres=# show transaction_isolation;
 transaction_isolation
-----------------------
 read committed
(1 行记录)
postgres=# SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET
postgres=# show transaction_isolation;
 transaction_isolation
-----------------------
 repeatable read
(1 行记录)

Запустить транзакцию с указанным уровнем изоляции

Уровень изоляции можно указать непосредственно при запуске транзакции:

postgres=# BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN
postgres=# show transaction_isolation;
 transaction_isolation
-----------------------
 repeatable read
(1 行记录)

Установить уровень изоляции транзакций в текущем сеансе

Синтаксис для установки уровня изоляции для текущего сеанса немного сложен, и синтаксис выглядит следующим образом:

SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL [ SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED ]

Операторы SQL постоянно изменяют глобальный уровень изоляции транзакций.

В командной строке или с помощью операторов SQL вы также можете навсегда изменить уровень изоляции глобальных транзакций.ALTER SYSTEM SET default_transaction_isolation TO 'xxx'

После завершения модификации выполнитеSELECT pg_reload_conf();Оператор SQL перезагружает конфигурацию PostgreSQL, чтобы она вступила в силу. Таким образом, нет необходимости перезапускать службу pg.

postgres=# ALTER SYSTEM SET default_transaction_isolation TO 'REPEATABLE READ';
ALTER SYSTEM
postgres=# SELECT pg_reload_conf();
 pg_reload_conf
----------------
 t
(1 行记录)

postgres=# show default_transaction_isolation;
 default_transaction_isolation
-------------------------------
 repeatable read
(1 行记录)

postgres=# SELECT current_setting('transaction_isolation');
 current_setting
-----------------
 repeatable read
(1 行记录)

Эта конфигурация является постоянной и по-прежнему действительна после перезапуска PostgreSQL.Конкретное место модификации временно неизвестно, так как просмотр файла конфигурацииpostgresql.conf, где настройки не были изменены. которыйALTER SYSTEM SETи не повлияло на файл конфигурации.

Уровень изоляции файла конфигурации PG, постоянно изменяющий транзакцию

В файле конфигурации PostgreSQL postgresql.conf есть конфигурация уровня изоляции, которую необходимо перезагрузить, чтобы она вступила в силу после изменения. Это навсегда изменяет глобальный уровень изоляции.

следующим образом:

#default_transaction_isolation = 'read committed'