Skip to content

Latest commit

 

History

History
182 lines (127 loc) · 4.56 KB

HW-1.md

File metadata and controls

182 lines (127 loc) · 4.56 KB

Домашнее задание №1

Работа с уровнями изоляции транзакции в PostgreSQL

Данные о сервере

Для работы используется виртуальная машина на частном облаке со следующими характеристиками:

  • CPU: 2 core Xeon E5-2690v2
  • RAM: 4 Gb
  • SSD: 20 Gb SSD
  • ОС: Ubuntu 24.04 LTS

Обновление ОС и установка необходимого ПО

Запускаем полное обновление ОС перед началом работы:

sudo apt-get update && sudo apt-get dist-upgrade -y

После окончания обновления при необходимости перезагружаем ВМ:

sudo reboot

Подключаем репозиторий PostgreSQL:

sudo apt install -y postgresql-common
sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh

Устанавливаем PostgreSQL 16:

sudo apt-get install postgresql-16

Проверяем, что всё прошло успешно и запущено:

pg_lsclusters

Запускаем psql от пользователя postgres:

sudo -u postgres psql

Проверяем, что стандартные таблицы созданы:

\l

Меняем пароль на пользователя postgres:

alter user postgres password 'sCkDIQz{?fxF#Acz';

Пароль указан для примера.

Выключаем autocommit и проверяем, что он выключен:

\set AUTOCOMMIT off
\echo :AUTOCOMMIT

В первой ssh-сессии создаем таблицу и заполняем данными:

create table persons(id serial, first_name text, second_name text);
insert into persons(first_name, second_name) values('ivan', 'ivanov');
insert into persons(first_name, second_name) values('petr', 'petrov');
commit;

Проверяем текущий уровень изоляции:

SHOW TRANSACTION ISOLATION LEVEL;

Добавляем в первой сессии запись без коммита:

insert into persons(first_name, second_name) values('sergey', 'sergeev');

Во второй сесии выполняем запрос:

select * from persons;

Новой записи (sergey sergeev) мы не видим, т.к. в первой сессии не был сделан commit, а уровень изоляции в данный момент read commited.

Завершаем транзакцию в первой сессии:

commit;

Во второй сессии выполняем запрос:

select * from persons;

Новую запись (sergey sergeev) мы видим, т.к. в первой сессии мы завершили транзакцию.

Завершаем транзакцию во второй сессии:

commit;

Меняем уровень изоляции в обоих сессиях и проверяем:

set transaction isolation level repeatable read;
SHOW TRANSACTION ISOLATION LEVEL;

В первой сессии добавляем новую запись без коммита:

insert into persons(first_name, second_name) values('sveta', 'svetova');

Во второй сессии выполняем запрос:

select * from persons;

Новой записи (sveta svetova) нет.

Завершаем транзакцию в первой сессии:

commit;

Во второй сессии выполняем запрос:

select * from persons;

Новой записи (sveta svetova) нет.

Завершаем транзакцию во второй сессии:

commit;

После завершения транзакции повторяем запрос во второй сессии:

select * from persons;

Новая запись (sveta svetova) видна, т.к. предыдущая транзакция была завершена и выборка была получена заново.