🗄️ SQL и базы данных  ·  20 вопросов  ·  ~43 мин  ·  ⏱ Таймер 43:00  ·  Сложный  · 

Уровни изоляции

В тесте две транзакции идут по временной линии, а ответ определяется тем, что каждая из них может увидеть. Нужно распознать грязное и неповторяемое чтение, фантомы, особенности Read Committed и Repeatable Read в PostgreSQL, понять, зачем Serializable иногда отменяет корректно написанную транзакцию, и выбрать уровень вместе со стратегией повторного выполнения.

Отвечено: 0 из 20
⏱ --:--
0%
💡 Инструкция: Выбери один ответ из четырёх. В тесте 20 вопросов и 43 минут. После завершения откроются общий процент, четыре тематические шкалы, правильные ответы и разбор каждого задания.
Вопрос 1 из 20
Как называется чтение данных, которые другая транзакция ещё не зафиксировала?
Вопрос 2 из 20
T1 дважды читает одну строку, а между чтениями T2 меняет её и фиксирует. Второе значение отличается. Что это?
SQL
-- T1: SELECT balance FROM accounts WHERE id=1;
-- T2: UPDATE accounts SET balance=200 WHERE id=1; COMMIT;
-- T1: SELECT balance FROM accounts WHERE id=1;
Вопрос 3 из 20
T1 повторяет запрос WHERE status='new', а T2 между ними вставляет новую подходящую строку. Как называется эффект?
SQL
-- T1: SELECT * FROM orders WHERE status='new';
-- T2: INSERT INTO orders(status) VALUES ('new'); COMMIT;
-- T1: SELECT * FROM orders WHERE status='new';
Вопрос 4 из 20
Две транзакции читают balance=100, затем записывают 110 и 120. Что потеряно?
SQL
-- T1 и T2 читают одно значение
SELECT balance FROM accounts WHERE id=1;
-- затем записывают 110 и 120
Вопрос 5 из 20
Чем write skew отличается от потерянного обновления?
Вопрос 6 из 20
Какой снимок использует обычный SELECT на Read Committed в PostgreSQL?
SQL
BEGIN ISOLATION LEVEL READ COMMITTED;
SELECT status FROM orders WHERE id=7;
-- другая транзакция выполняет COMMIT
SELECT status FROM orders WHERE id=7;
Вопрос 7 из 20
Допускает ли PostgreSQL грязное чтение при Read Committed?
Вопрос 8 из 20
Что может увидеть второй SELECT T1 на Read Committed после COMMIT T2?
SQL
-- T1 (READ COMMITTED)
SELECT balance FROM accounts WHERE id=1;
-- T2 изменяет строку и COMMIT
SELECT balance FROM accounts WHERE id=1;
Вопрос 9 из 20
Почему UPDATE на Read Committed может ждать?
SQL
-- T1
UPDATE accounts SET balance=90 WHERE id=1;
-- T2 до завершения T1
UPDATE accounts SET balance=80 WHERE id=1;
Вопрос 10 из 20
Подходит ли последовательность SELECT свободной задачи → UPDATE без блокировки для двух работников?
SQL
SELECT id FROM jobs WHERE status='new' ORDER BY id LIMIT 1;
UPDATE jobs SET status='running' WHERE id=:id;
Вопрос 11 из 20
Какой снимок использует PostgreSQL Repeatable Read?
SQL
BEGIN ISOLATION LEVEL REPEATABLE READ;
SELECT count(*) FROM orders;
-- параллельный INSERT и COMMIT
SELECT count(*) FROM orders;
Вопрос 12 из 20
Увидит ли повторный SELECT в Repeatable Read строку, которую T2 вставила и зафиксировала после начала снимка T1?
SQL
BEGIN ISOLATION LEVEL REPEATABLE READ;
SELECT COUNT(*) FROM orders WHERE status='new';
-- T2 INSERT + COMMIT
SELECT COUNT(*) FROM orders WHERE status='new';
Вопрос 13 из 20
Блокирует ли обычный SELECT все прочитанные строки до конца Repeatable Read?
Вопрос 14 из 20
Что может произойти, если T1 Repeatable Read пытается обновить строку, которую T2 изменила после снимка?
Вопрос 15 из 20
Защищает ли Repeatable Read PostgreSQL от любого write skew по разным строкам?
Вопрос 16 из 20
Какой результат обещает Serializable?
Вопрос 17 из 20
Почему приложение должно уметь повторять Serializable-транзакцию?
Вопрос 18 из 20
Что нужно повторять после serialization failure?
SQL
BEGIN ISOLATION LEVEL SERIALIZABLE;
-- чтения и изменения
COMMIT; -- может вернуть serialization failure
Вопрос 19 из 20
Почему отправку внешнего письма опасно выполнять до успешного COMMIT внутри повторяемой логики?
Вопрос 20 из 20
Всегда ли стоит ставить Serializable для каждого запроса?

Ответьте на все 20 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

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

Также доступна прямая ссылка на embed-страницу