Phantom read: Serializable va Repeatable Read farqi

Assalamu Alaykum bugun ACIDni misollar bilan ko'rishda davom etamiz bugun maqolada Phantom reads , Serializable va Repeatable read farqini ko'rib o'tamiz.

Phantom read va Isolation levellar haqida ko'proq bilmoqchi bo'lsangiz ushbu maqolani o'qing . ACID 2-qism (Isolation, Isolation levels)

Phantom read

Biz sales tabledan report olmoqchimiz va tranzaaksiya yaratib listni ko'rdik hamda har bir product uchun guruhlab uni chiqarmoqchimiz . Ammo bu paytda sotuvchilar ham sotuni amalga oshirdi va u bizni reportga keyingi querylarda qo'shilib kelmoqda.

select * from sales;
begin transaction;
select * from sales;
select product_id, sum(price * quantity) from sales group by product_id;insert into sales (product_id, price, quantity) values (4,90,5);

Bu holatda juda ko'p dasturlash productlari logikasi bo'yicha xohlanmaydigan holat va buni oldini olish uchun databazalar bizga isolation level imkoniyatini bergan. Keling shu ishni serializable isolation levelda qilib ko'ramiz. Rasmdan ko'rganingizdek tranzaksiya boshlangandan so'ng unga kiritilgan insert va commitlar hammasi ko'rinay turadi toki tranzaksiya tugaguncha. Bu postgresdan boshqa hamma databaza uchun tog'ri (postgres repetable read levelda ham phantom readsga yo'l qo'ymaydi).

Serializable va Repeatable isolation level

Bu yerda yana bizga nimaga serializable non-repetable leveldagi muammoni yechishini ko'rib o'tamiz. Tassavvur qiling ikki quyi rasmdagi tranzaksiya bir vaqtda ishga _isolation level_repetable read . Va natija quyidagiday bo'ladi va bu siz xohlagan narsa bo'lishi mumkin ammo bo'lmasligi ham mumkin.

CREATE TABLE test (
  id INT AUTO_INCREMENT PRIMARY KEY,
  value CHAR(1)
);
INSERT INTO test (value) VALUES
('x'),
('x'),
('y'),
('y');

Non-repetable read isolation level

Serializable levelda xuddi shu ishni qilganda quyidagidek bo'ladi.

Serializable isolation level

Ko'rib turganingizdek 2 tranzaksiya bir vaqtda shu tablega yozmoqchi bo'ldi ammo oldingi tranzaksiya unga o'zgartirish kiritgani va u hozir yozilgani bilan ustma ust tushgani uchun xatolik qaytardi ( qayta amalga oshirilganda ishladi). Serializable level ishlatishda ushbu xatoliklarni ushlab qolishni ham inobatga olish zarur.

Xulosa

Mana Phantom readni misollar bilan ko'rib chiqdik .Serializable va Repeatable read bizlarga nimani taminlashini bilib oldik .