# SQL tranzaksiya — hammasi yoki hech nima

> SQL tranzaksiya (transaction): BEGIN, COMMIT va ROLLBACK bilan bir nechta amalni yaxlit bajarish. Yarim bajarilgan o'zgarishlardan qanday saqlanish kerak.

Manba: https://learncode.uz/sql/tranzaksiya/
Sana: 2026-06-18

Ba'zan bitta ish bir nechta amaldan iborat bo'ladi va ularning **hammasi**
bajarilishi yoki **hech biri** bajarilmasligi kerak. Masalan omborni
kamaytirib, buyurtma qo'shish — biri bajarilib, ikkinchisi bajarilmasa, baza
noto'g'ri holatga tushadi. Shu muammoni **tranzaksiya** yechadi.

## Muammo: yarim bajarilgan ish

Aziz 5 dona Guruch (`id` 8) sotib oldi. Ikki amal kerak:

1. Ombordan 5 dona ayirish ([`UPDATE`](https://learncode.uz/sql/update)).
2. Yangi buyurtma qo'shish ([`INSERT`](https://learncode.uz/sql/insert)).

Agar birinchisi bajarilib, ikkinchisida (masalan tok o'chib) uzilib qolsa —
ombor kamaydi, lekin buyurtma yo'q. Ma'lumot **buzildi**.

## Yechim: BEGIN, COMMIT, ROLLBACK

Tranzaksiya bir nechta amalni bitta **yaxlit** blokka o'raydi:

```sql
BEGIN TRANSACTION;

UPDATE mahsulotlar SET soni = soni - 5 WHERE id = 8;

INSERT INTO buyurtmalar (id, mijoz_id, mahsulot_id, soni, sana)
VALUES (7, 1, 8, 5, '2026-07-10');

COMMIT;
```

O'zingiz ishga tushirib ko'ring — so'rovni tahrirlashingiz ham mumkin:

```sql
BEGIN;
UPDATE mahsulotlar SET soni = soni - 5 WHERE nom = 'Non';
SELECT nom, soni FROM mahsulotlar WHERE nom = 'Non';
ROLLBACK;

-- ROLLBACK dan keyin:
SELECT nom, soni FROM mahsulotlar WHERE nom = 'Non';
```

- `BEGIN TRANSACTION` — tranzaksiyani boshlaydi.
- `COMMIT` — barcha o'zgarishlarni **yakuniy** saqlaydi.
- Agar `COMMIT` gacha xatolik yuz bersa, hech narsa saqlanmaydi.

Endi ikki amal **birga** bajariladi: yo ikkalasi ham saqlanadi, yo ikkalasi
ham bekor bo'ladi. Yarim holat bo'lmaydi.

## ROLLBACK — o'zgarishni bekor qilish

Agar biror narsa noto'g'ri ketsa, `COMMIT` o'rniga `ROLLBACK` yozib, barcha
o'zgarishni **orqaga qaytarasiz**:

```sql
BEGIN TRANSACTION;

UPDATE mahsulotlar SET narx = narx * 2;   -- xato: hamma narx ikkilandi!

ROLLBACK;   -- bekor qilamiz — narxlar eski holiga qaytadi
```

`ROLLBACK` dan keyin `UPDATE` go'yo umuman bo'lmagandek — barcha narx avvalgi
qiymatida qoladi.

> **Atama**
>
> **Tranzaksiya** — bir yoki bir nechta amalning **yaxlit** guruhi. Uning
> qoidasi "hammasi yoki hech nima": yo barcha amal muvaffaqiyatli yakunlanadi
> (`COMMIT`), yo hech biri qo'llanmaydi (`ROLLBACK`). Bu ma'lumotni yarim
> bajarilgan holatdan saqlaydi.

> **Boshlovchilar tez-tez yanglishadigan joy**
>
> `COMMIT` yoki `ROLLBACK` yozishni unutmang. `BEGIN` dan keyin tranzaksiya
> **ochiq** qoladi va o'zgarishlar boshqa foydalanuvchilarga ko'rinmaydi hamda
> jadval bloklanib turishi mumkin. Har `BEGIN` o'z `COMMIT` yoki `ROLLBACK` i
> bilan yopilishi shart.

## Amaliy mashq

Tranzaksiyani sinang:

1. `BEGIN;` bilan boshlang;
2. `UPDATE` bilan `Non` sonini kamaytiring;
3. `SELECT` bilan o'zgarishni ko'ring;
4. `ROLLBACK;` yozing va yana `SELECT` qiling;
5. xuddi shuni `COMMIT;` bilan takrorlang;
6. bitta tranzaksiyaga `UPDATE` va `INSERT` ni birga o'rab, `COMMIT`
   bilan yakunlang — ikkala o'zgarish ham saqlanganini tekshiring.

4 va 5-qadam natijalari nega har xil?

## Qisqacha xulosa

- **Tranzaksiya** — bir nechta amalni yaxlit bajaradi: "hammasi yoki hech nima".
- `BEGIN TRANSACTION` boshlaydi, `COMMIT` o'zgarishni yakuniy saqlaydi.
- `ROLLBACK` barcha o'zgarishni orqaga qaytaradi (xato yuz berganda).
- Bir-biriga bog'liq amallarni (ombor − buyurtma) doim bitta tranzaksiyaga
  o'rang — yarim holatdan shunday saqlanadi.
- Har `BEGIN` `COMMIT` yoki `ROLLBACK` bilan yopilishi kerak.

Keyingi darsda [`UNION`](https://learncode.uz/sql/union) — ikki so'rov natijasini ustma-ust
birlashtirishni ko'ramiz.
