SQLda tranzaksiyalar nima?

SQLda tranzaksiya nima? Tranzaksiyalardan to'g'ri foydalanmaslik nimalarga sabab bo'lishi mumkin?

Tranzaksiyalar ma'lumotlar bazasida muhim ahamiyatga ega bo'lib, ma'lumotlarning ishonchliligini ta'minlaydi. PostgreSQL-da tranzaksiyalar bir nechta SQL query(operatsiya) larini birgalikda guruhlash imkonini beradi. Agar guruhdagi barcha operatsiyalar muvaffaqiyatli bo'lsa, biz o'zgarishlarni saqlash uchun tranzaksiyani commit(saqlash) qilishimiz mumkin. Agar shu guruhlanga birorta sql query da xatolik yuzaga kelsa, biz tranzaksiya boshlangandan keyingi kiritilgan barcha o'zgarishlarni bekor qilib, uni orqaga qaytarishimiz mumkin. Bu xatolarni qayta ishlash, ma'lumotlar yaxlitligini himoya qilish va ma'lumotlar yo'qolishining oldini olish uchun juda foydali. Transaction lardan foydalanish orqali biz yozayotgan logikamizni yarmi bajarilib yarmi yuklanmay qolishini oldina olishimiz mumkin.


Kelinglar transaction lar qanaqa ishlashini Postgresql misolida ko'rib chiqaylik. Postgresql da  tranzaksiyalar ACID tamoyillariga amal qiladi.

  1. Atomicity: Bitta transaction ichidagi barcha operatsiyalarni muffaqiyatli bajarilishi yoki hech biri ishlamasligini taminlab beradi
  2. Consistency: Transaction lar database ni bir ishlab turgan holatdan boshqa bir ishlab turadigan holatga olib o'tishni taminlab beradi. transaction ishlashi davomida nimadir bo'lib database buzilib qolmasligiga kafolat beradi.
  3. Isolation: Har bir transaction alohida alohida ishlashi va bir biriga aralashib ketmasligini taminlab beradi.
  4. Durability: Har bir muaffaqiyatli ishlagan transaction tizimda doimiy ravishda saqlanishi va har qanday holatda o'chib ketmasligini taminlab beradi.

Tranzaksiya da asosiy buyruqlar

Postgresqlda transaction lar bilan ishlash uchun 3 ta asosiy komandalar bor.

  1. BEGIN: Yangi transaction boshlash uchun
  2. COMMIT: Boshlangan transaction dagi barcha o'zgarishlarni database ga saqlash uchun
  3. ROLLBACK: Boshlangan transaction dagi barcha qilinga o'zgarishlarni ortga qaytarish uchun

Postgresql da odatda har bir yozilayotgan query ishlashi bilan avtomatik ravishda COMMIT ​qilib saqlab boriladi(autocommit mode). BEGIN buyruq ishga tushirilishi bilan autocommit o'chiriladi.

COMMIT buyrug'i uchun misol

BEGIN;

UPDATE users

SET balance = balance + 50

WHERE id = 1;


INSERT INTO transactions (user_id, amount, type) VALUES (1, 50, 'credit');

COMMIT;

agar transactions jadvalida ham yangi transaction qo'sha olsagina balance ni 50 ga oshirish mumkin

ROLLBACK buyrug'i uchun misol

BEGI​N;

UPDATE users SET balance = balance + 50 WHERE id = 1;

INSERT IN​TO transactions (user_id, amount, type) VALUES (1, 50, 'credit');

INSERT INTO non_existent_table (user_id) VALUES (1);


ROLLBACK;


bu yerda ham bizning o'zimiz xatolik sodir qilib transaction ni bekor qilib yubordik. Bu ixtiyoriy xatolik bo'lishi mumkin ixtiyoriy dasturlash tilimizda  yuzaga kelgan xatoliklar paytida shunchaki ROLLBACK buyrug'ini chaqirishimiz yetarli bo'ladi.


Tranzaksiyalar haqida dastlabki asosiy tushunchalarni tushunib oldik endi transaction lardan foydalanish davomidagi eng muhim bo'lgan etibor berishimiz kerak bo'lgan qismlariga to'xtalamiz.


Perfomance(Samaradorlik)

Tranzaktsiyalar butun boshli jadvallarni yoki jadvallardagi biror qatotlarni vaqtinchalikka bloklab qo'yishi mumkin shu sabablik tranzaksiyalarni iloji boricha kichik qilib foydalanish orqali perfomance ni yaxshilashingiz mumkin.

Deadlocklarda saqlanish

Deadlock o'zi bir vaqtning o'zida 2 tranzaksiyani bir biriga bog'liq bo'lishi bir birini kutib qolishidan yuzaga keladigan jarayon hisoblanadi bunaqa holatda ikkala tranzaksiyalar ham max vaqt bir birini kutib keyin ikkalasi ham fail bo'lishi mumkin.

Deadlockning Oddiy Misoli (PostgreSQLda)

Keling, bizda quyidagi kabi ikkita jadval mavjud deb faraz qilaylik:

  1. customers — mijozlar jadvali
  2. orders — buyurtmalar jadvali

Endi, ikkita foydalanuvchi (ularni A va B deb ataymiz) bir vaqtning o’zida ma’lumotlarni yangilamoqchi bo’ldi. Mana ularning har biri nima qilmoqchi:

  • A foydalanuvchi customers jadvalidan biror bir qatorni o’zgartirmoqchi, va so'ng orders jadvalida biror amal bajarmoqchi.
  • B foydalanuvchi esa aksincha: birinchi orders jadvalidan qatorni o’zgartirmoqchi, keyin esa customers jadvalida amal bajarmoqchi.

Agar ikkalasi bir vaqtda ishni boshlasa, ular quyidagi tartibda deadlock holatini keltirib chiqarishi mumkin.

Foydalanuvchi A

  1. Transaction boshlaydi:                      BEGIN;
  2. customers jadvalini o’zgartiradi:      UPDATE customers SET balance = balance + 100 WHERE id = 1;
  3. Endi orders jadvalida o’zgartirish qilishni rejalashtirmoqda, lekin kutib turishi kerak, chunki B foydalanuvchi ham bu jadvallar ustida ishlamoqda.

Foydalanuvchi B

  1. Transaction boshlaydi:          BEGIN
  2. orders jadvalini o’zgartiradi: UPDATE orders SET amount = amount - 50 WHERE customer_id = 1;
  3. Endi customers jadvalida o’zgartirish qilishni rejalashtirmoqda, lekin A foydalanuvchi uni band qilib olgan.

Bu holatda ikkala foydalanuvchi ham bir-birini kutib qolyapti:

  • A foydalanuvchi orders jadvali bo'shashini kutyapti.
  • B foydalanuvchi esa customers jadvali bo'shashini kutyapti.

Natijada, ikkalasi ham hech qachon o’z ishini tugata olmaydi va deadlock holati yuzaga keladi. Buni PostgreSQL odatda aniqlab, avtomatik ravishda bittasini bekor qiladi va xatolik haqida xabar chiqaradi.

Deadlocklardan qanday qochish mumkin?

Deadlocklardan qochish uchun ba’zi qoidalar:

  1. Amallarning bir xil tartibini saqlang: Masalan, har doim avval customers, keyin orders jadvalini yangilang. Shu tartibni barcha foydalanuvchilar kuzatsa, deadlock xavfi kamayadi.
  2. Kichik tranzaksiyalar yarating: Har bir tranzaksiya ichidagi SQL amallarini iloji boricha tez va qisqa qilib bajaring. Shu orqali resurslarning uzoq vaqt band bo’lishini oldini olasiz.
  3. Kutish vaqtini cheklash: Ayrim tizimlarda kutish vaqtini cheklab, jarayonlar uzoq kuta boshlasa, tranzaksiyalarni avtomatik bekor qilish ham samarali bo’lishi mumkin.

Xulosa

  • Tranzaksiya bir biriga bog'liq bo'lgan bir nechta buyruqlarni birgalikda ishlashiga yordam beradi.
  • Tranzaksiyalardan foydalanmaslik loyihadagi bir biriga bog'liq logikalarni buzilib ketishiga sabab bo'lishi mumkin
  • Tranzaksiyalardan foydalanishda deadlockga tushib qolmasligiga muhim etibor qaratish lozim
  • iloji boricha kichik tranzaksiyalar yaratish kerak


Transaction mavzusi yetarlicha qiziq va tushunarli bo'ldimi? Database turkimidagi postlarni davom ettiramizmi? 👇👇👇👇
                                 💬 💬 💬 💬