Transactions and Error Handling in SQL Server
Miriam Antona
Software Engineer
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
Dirty reads | Non-repeatable reads | Phantom reads | |
---|---|---|---|
READ UNCOMMITTED | yes | yes | yes |
READ COMMITTED | no | yes | yes |
REPEATABLE READ | no | no | yes |
SERIALIZABLE | no | no | no |
WHERE
clause based on an index range -> Locks only that recordsTransaction 1
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
SELECT * FROM customers
WHERE customer_id BETWEEN 1 AND 3;
| customer_id | first_name | last_name | ... | phone |
|-------------|------------|-----------|-----|-----------|
| 1 | Dylan | Smith | ... | 555888999 |
Locked record
Transaction 1
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
SELECT * FROM customers
WHERE customer_id BETWEEN 1 AND 3;
| customer_id | first_name | last_name | ... | phone |
|-------------|------------|-----------|-----|-----------|
| 1 | Dylan | Smith | ... | 555888999 |
Locked record
Transaction 2
...
...
INSERT INTO customers (customer_id, first_name, ...)
VALUES (2, 'Phantom', 'Ph', '[email protected]', 555666222);
Has to wait!
Transaction 1
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
SELECT * FROM customers
WHERE customer_id BETWEEN 1 AND 3;
SELECT * FROM customers
WHERE customer_id BETWEEN 1 AND 3;
| customer_id | first_name | last_name | ... | phone |
|-------------|------------|-----------|-----|-----------|
| 1 | Dylan | Smith | ... | 555888999 |
Transaction 2
...
...
INSERT INTO customers (customer_id, first_name, ...)
VALUES (2, 'Phantom', 'Ph', '[email protected]', 555666222);
Has to wait!
Transaction 1
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
SELECT * FROM customers
WHERE customer_id BETWEEN 1 AND 3;
SELECT * FROM customers
WHERE customer_id BETWEEN 1 AND 3;
COMMIT TRAN
Transaction 2
...
...
INSERT INTO customers (customer_id, first_name, ...)
VALUES (2, 'Phantom', 'Ph', '[email protected]', 555666222);
Finally executed!
Transaction 1
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
SELECT * FROM customers
WHERE customer_id BETWEEN 1 AND 3;
| customer_id | first_name | last_name | ... | phone |
|-------------|------------|-----------|-----|-----------|
| 1 | Dylan | Smith | ... | 555888999 |
Transaction 2
...
...
INSERT INTO customers (customer_id, first_name, ...)
VALUES (200, 'Phantom', 'Ph', '[email protected]', 555666222);
Instantly inserted!
Transaction 1
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
SELECT * FROM customers;
| customer_id | first_name | last_name | ... | phone |
|-------------|------------|-----------| ... |-----------|
| 1 | Dylan | Smith | ... | 555888999 |
...
| 10 | Carol | York | ... | 555148988 |
Locks the complete table
Transaction 2
...
...
INSERT INTO customers
VALUES (100, 'Phantom', 'Ph', '[email protected]', 555666222);
Has to wait!
Transaction 1
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
SELECT * FROM customers;
SELECT * FROM customers;
| customer_id | first_name | last_name | ... | phone |
|-------------|------------|-----------| ... |-----------|
| 1 | Dylan | Smith | ... | 555888999 |
...
| 10 | Carol | York | ... | 555148988 |
Transaction 2
...
...
INSERT INTO customers
VALUES (100, 'Phantom', 'Ph', '[email protected]', 555666222);
Has to wait!
Transaction 1
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
SELECT * FROM customers;
SELECT * FROM customers;
COMMIT TRAN
Transaction 2
...
...
INSERT INTO customers
VALUES (100, 'Phantom', 'Ph', '[email protected]', 555666222);
Finally executed!
Pros:
Cons:
SERIALIZABLE
transactionWhen to use it?:
Transactions and Error Handling in SQL Server