Transactions and Error Handling in SQL Server
Miriam Antona
Software Engineer
tempDB
databaseALTER DATABASE myDatabaseName SET ALLOW_SNAPSHOT_ISOLATION ON;
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
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 |
SNAPSHOT | no | no | no |
Transaction1
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
BEGIN TRAN
SELECT * FROM accounts;
|account_id|account_number |...| current_balance|
|----------|--------------------|---|----------------|
|1 |55555555551234567890|...| 25000,00 |
|2 |55555555559876543210|...| 200,00 |
|... |... |...| ... |
|15 |55555555551234567890|...| 25000,00 |
Transaction2
...
...
BEGIN TRAN
INSERT INTO accounts
VALUES (11111111111111111111, 1, 25000);
UPDATE accounts
SET current_balance = 30000 WHERE account_id = 1;
SELECT * FROM accounts;
COMMIT TRAN
It is not blocked!
Transaction1
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
BEGIN TRAN
SELECT * FROM accounts;
SELECT * FROM accounts;
|account_id|account_number |...| current_balance|
|----------|--------------------|---|----------------|
|1 |55555555551234567890|...| 25000,00 |
|2 |55555555559876543210|...| 200,00 |
|... |... |...| ... |
|15 |55555555551234567890|...| 25000,00 |
Transaction2
...
...
BEGIN TRAN
INSERT INTO accounts
VALUES (11111111111111111111, 1, 25000);
UPDATE accounts
SET current_balance = 30000 WHERE account_id = 1;
SELECT * FROM accounts;
COMMIT TRAN
It is not blocked!
Pros:
Cons:
tempDB
increasesWhen to use it?:
ALTER DATABASE myDatabaseName SET READ_COMMITTED_SNAPSHOT {ON|OFF};
OFF by default
To use ON:
ALTER DATABASE myDatabaseName SET ALLOW_SNAPSHOT_ISOLATION ON;
Transaction1
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
BEGIN TRAN
UPDATE accounts
SET current_balance = 30000
WHERE account_id = 1;
COMMIT TRAN
Transaction2
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
BEGIN TRAN
SELECT current_balance FROM accounts
WHERE account_id = 1;
| current_balance |
|-----------------|
| 35000,00 |
Transaction1
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
BEGIN TRAN
UPDATE accounts
SET current_balance = 30000
WHERE account_id = 1;
COMMIT TRAN
Transaction2
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
BEGIN TRAN
SELECT current_balance FROM accounts
WHERE account_id = 1;
SELECT current_balance FROM accounts
WHERE account_id = 1;
| current_balance |
|-----------------|
| 30000,00 |
READ UNCOMMITTED
applies to the entire connection / WITH (NOLOCK)
applies to a specific tableOriginal balance account 5 = $35,000
Transaction1
BEGIN TRAN
UPDATE accounts
SET current_balance = 30000
WHERE account_id = 5;
Transaction2
...
...
...
SELECT current_balance
FROM accounts WITH (NOLOCK)
WHERE account_id = 5;
| current_balance |
|-----------------|
| 30000,00 |
Transactions and Error Handling in SQL Server