---
title: 'ACID Özellikleri'
source: 'https://academia.sh/tr/kurslar/iliskisel-kuram/acid-ozellikleri'
course: 'Veri Modelleme ve İlişkisel Kuram'
language: tr
updated: '2026-08-17T18:08:59+00:00'
license: 'CC BY-SA 4.0'
---

# ACID Özellikleri

İşlem kavramı ve atomiklik, tutarlılık, yalıtım, kalıcılık güvencelerinin tanımı; geri alma ve kalıcılığın çalıştırılarak gösterimi, istemcinin hata karşısındaki sorumluluğu.

Önceki ders iki kez aynı varsayıma dayandı: bir ödünç kaydının yazılması ya tümüyle olur ya
hiç olmaz, ve bir çözümleme sorgusu yarım yazılmış bir durumu görmez. Aynı varsayımlar
kursun ilk dersinde de geçmişti — dosyaya eşzamanlı yazan iki süreç ikisini de
sağlayamamıştı. Bu dersin sorusu şudur: veritabanı yönetim sistemi bu güvenceleri hangi
adla, hangi sınırlar içinde verir?

## İşlem

**İşlem** (transaction), veritabanı üzerinde tek bir birim gibi ele alınan deyimler
dizisidir. Bir nüshanın bir şubeden diğerine aktarılması iki güncelleme gerektirir; ikisi
birlikte olmalıdır, çünkü aralarında kalan durumda kütüphanede bir nüsha eksiktir.

İşlemin sınırları açıkça bildirilir: başlangıç, ardından ya **onaylama** (commit) ya da
**geri alma** (rollback). Bildirilmediğinde her deyim kendi başına bir işlem sayılır.

İşlemlerin verdiği güvenceler dört başlık altında toplanır ve baş harfleriyle **ACID**
diye anılır: atomiklik, tutarlılık, yalıtım, kalıcılık.

## Atomiklik

**Atomiklik** (atomicity), işlemin ya tamamen uygulanmasını ya da hiç uygulanmamasını
ister. Ara durum hiçbir zaman kalıcı olmaz.

```sh
sqlite3 :memory: <<'SQL'
.headers on
.mode box
CREATE TABLE stok (sube_kodu TEXT NOT NULL, isbn TEXT NOT NULL, adet INTEGER NOT NULL,
                   PRIMARY KEY (sube_kodu, isbn), CHECK (adet >= 0));
INSERT INTO stok VALUES ('MRK', '975-01', 3), ('BHC', '975-01', 1);

BEGIN;
UPDATE stok SET adet = adet - 1 WHERE sube_kodu = 'MRK' AND isbn = '975-01';
UPDATE stok SET adet = adet + 1 WHERE sube_kodu = 'BHC' AND isbn = '975-01';
SELECT 'islem icinde' AS an, sube_kodu, adet FROM stok ORDER BY sube_kodu;
ROLLBACK;
SELECT 'geri alindiktan sonra' AS an, sube_kodu, adet FROM stok ORDER BY sube_kodu;
SQL
```

```
┌──────────────┬───────────┬──────┐
│      an      │ sube_kodu │ adet │
├──────────────┼───────────┼──────┤
│ islem icinde │ BHC       │ 2    │
│ islem icinde │ MRK       │ 2    │
└──────────────┴───────────┴──────┘
┌───────────────────────┬───────────┬──────┐
│          an           │ sube_kodu │ adet │
├───────────────────────┼───────────┼──────┤
│ geri alindiktan sonra │ BHC       │ 1    │
│ geri alindiktan sonra │ MRK       │ 3    │
└───────────────────────┴───────────┴──────┘
```

İşlemin içinde iki güncelleme de görünür; geri alma sonrasında ikisi de yoktur. Atomiklik
yalnız hata durumu için değildir — geri alma, uygulamanın bilerek verdiği bir karar da
olabilir. Kursun ilk dersindeki dosya örneğinde bu düzenek yoktu: yarım kalan yazma
dosyada yarım kalıyordu.

## Tutarlılık

**Tutarlılık** (consistency), işlemin veritabanını bir geçerli durumdan başka bir geçerli
duruma taşımasını ister. "Geçerli" olan, şemadaki kısıtların tümünün sağlandığı durumdur.
İşlemin ortasında kısıt geçici olarak bozulabilir; işlem sonunda bozuk kalamaz.

```sh
rm -f kutuphane.db

sqlite3 kutuphane.db <<'SQL'
CREATE TABLE stok (sube_kodu TEXT NOT NULL, isbn TEXT NOT NULL, adet INTEGER NOT NULL,
                   PRIMARY KEY (sube_kodu, isbn), CHECK (adet >= 0));
INSERT INTO stok VALUES ('MRK', '975-01', 3), ('BHC', '975-01', 1);
SQL

sqlite3 kutuphane.db <<'SQL'
.bail on
BEGIN;
UPDATE stok SET adet = adet - 1 WHERE sube_kodu = 'BHC' AND isbn = '975-01';
UPDATE stok SET adet = adet - 1 WHERE sube_kodu = 'BHC' AND isbn = '975-01';
COMMIT;
SQL

sqlite3 kutuphane.db <<'SQL'
.headers on
.mode box
SELECT sube_kodu, adet FROM stok ORDER BY sube_kodu;
SQL
```

```
Runtime error near line 4: CHECK constraint failed: adet >= 0 (19)
┌───────────┬──────┐
│ sube_kodu │ adet │
├───────────┼──────┤
│ BHC       │ 1    │
│ MRK       │ 3    │
└───────────┴──────┘
```

İkinci güncelleme adedi eksiye düşüreceği için reddedildi; birincisi de geri alındı ve
adet başlangıçtaki bire döndü.

Bu sonucun bir koşulu vardır ve gözden kaçar. Bloktaki ilk satır, istemciye ilk hatada
durmasını söyler; adı ve yazılışı motora ve araca göre değişir. O satır olmasaydı istemci
hatayı yok sayıp `COMMIT` gönderir ve **yalnız birinci güncellemenin uygulandığı** yarım
bir iş kalıcı olurdu. Tutarlılık güvencesi motorun kısıtları uygulamasıyla başlar ama
istemcinin hata karşısında doğru davranmasıyla tamamlanır. Hatayı yutan bir istemci,
motorun verdiği güvenceyi elinden alır.

## Yalıtım

**Yalıtım** (isolation), aynı anda çalışan işlemlerin birbirinin yarım durumunu
görmemesini ister. En katı yorumu şudur: eşzamanlı çalışan işlemlerin sonucu, aynı
işlemlerin bir sırayla teker teker çalıştırılmasından elde edilebilecek bir sonuçla aynı
olmalıdır.

Bu güvence pahalıdır ve çoğu sistem onu tümüyle uygulamak yerine kademelendirir. Gevşetme
belirli anormallikleri serbest bırakır ve bunların adları vardır: bir işlemin başka bir
işlemin onaylanmamış yazmasını görmesi, aynı satırın iki okumada farklı değer vermesi, bir
koşula uyan satır kümesinin iki okumada farklı olması. Hangi kademede hangi anormalliğin
görülebileceği, kilitleme ile sürüm tabanlı yaklaşımların farkı ve kilitlenme durumları bu
müfredatın ilerleyen kurslarına aittir. Burada tanım düzeyinde bırakılıyor: kursun ilk
dersindeki kayıp güncelleme, yalıtımın bulunmadığı bir ortamda ne olduğunun örneğiydi.

## Kalıcılık

**Kalıcılık** (durability), onaylanmış bir işlemin sonucunun kalıcı olmasını ister —
sistem hemen ardından çökse bile. Onay bildirimi bir sözdür: veri artık kalıcı depolamada
güvencededir.

```sh
rm -f kutuphane.db

sqlite3 kutuphane.db <<'SQL'
CREATE TABLE odunc (odunc_no INTEGER PRIMARY KEY, uye_no INTEGER NOT NULL);
BEGIN;
INSERT INTO odunc VALUES (1001, 41);
COMMIT;
BEGIN;
INSERT INTO odunc VALUES (1002, 52);
ROLLBACK;
SQL

sqlite3 kutuphane.db <<'SQL'
.headers on
.mode box
SELECT odunc_no, uye_no FROM odunc;
SQL
```

```
┌──────────┬────────┐
│ odunc_no │ uye_no │
├──────────┼────────┤
│ 1001     │ 41     │
└──────────┴────────┘
```

İkinci çağrı ayrı bir süreçtir; veriyi yazan sürecin belleğinden hiçbir şey devralmaz.
Onaylanan satırı görür, geri alınan satırı görmez. Ölçüt işlemin sınırıdır: onaydan önce
yazılan hiçbir şey kalıcı sayılmaz, onaydan sonra yazılan her şey sayılır.

Kalıcılığın gerçekleştirimi genellikle bir kütüğe dayanır: değişiklikler veri sayfalarına
uygulanmadan önce ardışık bir **yazma öncesi günlükne** (write-ahead log) yazılır ve o
yazma disk üzerinde güvenceye alınır. Çökme sonrası açılışta kütük okunur; onaylanmış ama
sayfalara işlenmemiş değişiklikler tamamlanır, onaylanmamış olanlar geri alınır. **Kütük
biçimi, adı ve diske yazmanın hangi noktada güvenceye alındığı motora göre değişir**;
bazı motorlarda bu davranış ayarlanabilir ve gevşetildiğinde kalıcılık güvencesi de
gevşer.

## Bedeli ve Sınırları

Dört güvence bedava değildir. Atomiklik ve kalıcılık ek yazma gerektirir; yalıtım ya
kilit ya da sürüm saklama gerektirir. İşlemi gereğinden uzun tutmak, ne kadar veriyi ne
kadar süre kilitlediğini büyütür — kullanıcı girdisi bekleyen bir işlem yaygın bir
tasarım hatasıdır.

İki sınır da belirtilmelidir. Birincisi, ACID tek bir veritabanı içindir; iki ayrı sistemi
kapsayan bir iş için aynı güvence kendiliğinden gelmez. İkincisi, tutarlılık sözü
**şemada yazılı** kısıtlarla sınırlıdır. Şemaya yazılmamış bir iş kuralı, onaylanmış bir
işlem sonunda bozulmuş olabilir ve motor bunu bilmez. Bütünlük Kısıtları dersindeki
"kuralı şemaya yaz" ilkesinin buradaki karşılığı budur.

## Özet

- İşlem, tek bir birim gibi ele alınan deyimler dizisidir; sınırı onaylama ya da geri
  alma ile belirlenir.
- Atomiklik ara durumun kalıcı olmamasını, tutarlılık işlem sonunda bütün kısıtların
  sağlanmasını ister.
- Motorun kısıtı reddetmesi tek başına yetmez; hatayı yok sayıp onay gönderen bir istemci
  yarım işi kalıcı kılar.
- Yalıtım, eşzamanlı işlemlerin birbirinin yarım durumunu görmemesidir; kademeleri ve
  gerçekleştirimi ayrı bir kursun konusudur.
- Kalıcılık onay anına bağlıdır ve genellikle yazma öncesi günlükyle sağlanır; güvencenin
  ne kadar sıkı olduğu motora göre değişir ve ayarlanabilir.

## Sonraki Adım

Bu ders ilişkisel veritabanının verdiği sözleri tam olarak adlandırdı. Aynı adlandırma,
bir karşılaştırmayı da mümkün kılar: bu sözlerin bir bölümünden vazgeçen sistemler vardır
ve karşılığında başka şeyler sunarlar. Kursun son dersi bu seçimi ele alır — hangi veri ve
hangi erişim biçimi ilişkisel modeli gerektirir, hangi durumda başka bir veri modeli daha
uygun olur, ve bu karar hangi ölçütlerle verilir?
