PostgreSQL 11 Уровень изоляции для повторного чтения - PullRequest
0 голосов
/ 16 февраля 2019

Я пытаюсь понять реализацию уровня изоляции PostgreSQL и не могу понять, что я делаю неправильно.Я использую локальный PostgreSQL 11 и DBeaver 5.3.4 в качестве своей IDE.

Вот сценарий, который я тестирую:

CREATE SCHEMA Test;
CREATE TABLE Test.T1 (Col1 INT PRIMARY KEY, Col2 CHAR(2) NOT NULL);
INSERT INTO Test.T1 (Col1, Col2) VALUES (1,'A'), (2,'B'), (3,'C');

Я открываю 2 окна одновременного подключения к базе данных,В первом из них я выполняю следующие команды:

BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SELECT * FROM Test.T1 WHERE Col1 = 2;

Я получаю ожидаемый результат: 2-'B '.Затем в отдельном окне я выдаю следующее:

BEGIN TRANSACTION;
UPDATE Test.T1 SET Col2 = 'XX' WHERE Col1 = 2;

Сейчас, если переключиться обратно в первое окно, и снова выполним тот же SELECT:

SELECT * FROM Test.T1 WHERE Col1 = 2;

Так как транзакция быланачалось с изоляции REPEATABLE READ, я ожидаю увидеть результат из моментального снимка данных и получить повторяемое чтение 2-B, но вместо этого я получаю обновленное значение для Col2 = 2-'xx '.

Чего мне здесь не хватает?

Заранее спасибо за помощь и хороших выходных!

1 Ответ

0 голосов
/ 18 февраля 2019

Благодаря предложению @NickBarnes я отследил настройки IDE и обнаружил проблему.Оказывается, по умолчанию DBeaver использует одно и то же базовое соединение для всех окон редактора ...

Если вам нужно использовать отдельные соединения, перейдите к соединению или глобальным настройкам для «Редактора SQL» и в разделе «соединение» проверьтеmsgstr "использовать отдельные соединения для каждого редактора".Я считаю этот дефолт странным выбором, но, по крайней мере, теперь я знаю причину.

Хорошего дня!

...