SQL Server'da İşlemler ve Hata Yönetimi
Miriam Antona
Software Engineer
Eşzamanlılık: aynı anda paylaşılan veriyi okuyan/değiştiren iki veya daha fazla işlem.
İşlemi diğer işlemlerden yalıtma
READ COMMITTED (varsayılan)READ UNCOMMITTEDREPEATABLE READSERIALIZABLESNAPSHOTSET TRANSACTION ISOLATION LEVEL
{READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE | SNAPSHOT}
SELECT CASE transaction_isolation_level
WHEN 0 THEN 'UNSPECIFIED'
WHEN 1 THEN 'READ UNCOMMITTED'
WHEN 2 THEN 'READ COMMITTED'
WHEN 3 THEN 'REPEATABLE READ '
WHEN 4 THEN 'SERIALIZABLE'
WHEN 5 THEN 'SNAPSHOT'
END AS transaction_isolation_level
FROM sys.dm_exec_sessions
WHERE session_id = @@SPID
| transaction_isolation_level |
|-----------------------------|
| READ COMMITTED |
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
| Kirli okumalar | Tekrarlanamayan okumalar | Hayalet okumalar | |
|---|---|---|---|
| READ UNCOMMITTED | evet | evet | evet |
Hesap 5’in ilk bakiyesi = $35.000
İşlem1
BEGIN TRAN
UPDATE accounts
SET current_balance = 30000
WHERE account_id = 5;

ROLLBACK TRAN;
İşlem2
...
...
...
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT current_balance
FROM accounts WHERE account_id = 5;
| current_balance |
|-----------------|
| 30000,00 |
İşlem1
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
BEGIN TRAN
SELECT * FROM accounts WHERE account_id = 5;
| current_balance |
|-----------------|
| 35000,00 |
İşlem2
...
...
BEGIN TRAN
UPDATE accounts
SET current_balance = 30000 WHERE account_id = 5;
COMMIT TRAN
İşlem1
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
BEGIN TRAN
SELECT * FROM accounts WHERE account_id = 5;
| current_balance |
|-----------------|
| 35000,00 |
SELECT * FROM accounts WHERE account_id = 5;
| current_balance |
|-----------------|
| 30000,00 |
İşlem2
...
...
BEGIN TRAN
UPDATE accounts
SET current_balance = 30000 WHERE account_id = 5;
COMMIT TRAN
İşlem1
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
BEGIN TRAN
SELECT * FROM accounts
WHERE current_balance BETWEEN 45000 AND 50000
| account_number | ... | current_balance |
|----------------------|-----|-----------------|
| 55555555552020202020 | ... | 50000,00 |
İşlem2
...
...
BEGIN TRAN
INSERT INTO accounts
VALUES ('55555555553939393939', 1, 45000)
COMMIT TRAN
İşlem1
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
BEGIN TRAN
SELECT * FROM accounts
WHERE current_balance BETWEEN 45000 AND 50000
| account_number | ... | current_balance |
|----------------------|-----|-----------------|
| 55555555552020202020 | ... | 50000,00 |
SELECT * FROM accounts
WHERE current_balance BETWEEN 45000 AND 50000
| account_number |...| current_balance |
|----------------------|---|-----------------|
| 55555555553939393939 |...| 45000,00 | Hayalet!
| 55555555552020202020 |...| 50000,00 |
İşlem2
...
...
BEGIN TRAN
INSERT INTO accounts
VALUES ('55555555553939393939', 1, 45000)
COMMIT TRAN
Artıları:
Eksileri:
Ne zaman kullanılır?:
SQL Server'da İşlemler ve Hata Yönetimi