SQL Server 中的事务与错误处理
Miriam Antona
Software Engineer
tempDB 数据库ALTER DATABASE myDatabaseName SET ALLOW_SNAPSHOT_ISOLATION ON;
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
| 脏读 | 不可重复读 | 幻读 | |
|---|---|---|---|
| READ UNCOMMITTED | 是 | 是 | 是 |
| READ COMMITTED | 否 | 是 | 是 |
| REPEATABLE READ | 否 | 否 | 是 |
| SERIALIZABLE | 否 | 否 | 否 |
| SNAPSHOT | 否 | 否 | 否 |
事务1
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 |
事务2
...
...
BEGIN TRAN
INSERT INTO accounts
VALUES (11111111111111111111, 1, 25000);
UPDATE accounts
SET current_balance = 30000 WHERE account_id = 1;
SELECT * FROM accounts;
COMMIT TRAN
不会被阻塞!
事务1
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 |
事务2
...
...
BEGIN TRAN
INSERT INTO accounts
VALUES (11111111111111111111, 1, 25000);
UPDATE accounts
SET current_balance = 30000 WHERE account_id = 1;
SELECT * FROM accounts;
COMMIT TRAN
不会被阻塞!
优点:
缺点:
tempDB 占用增大何时使用:
ALTER DATABASE myDatabaseName SET READ_COMMITTED_SNAPSHOT {ON|OFF};
默认 OFF
使用 ON:
ALTER DATABASE myDatabaseName SET ALLOW_SNAPSHOT_ISOLATION ON;
事务1
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
BEGIN TRAN
UPDATE accounts
SET current_balance = 30000
WHERE account_id = 1;

COMMIT TRAN
事务2
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
BEGIN TRAN

SELECT current_balance FROM accounts
WHERE account_id = 1;
| current_balance |
|-----------------|
| 35000,00 |
事务1
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
BEGIN TRAN
UPDATE accounts
SET current_balance = 30000
WHERE account_id = 1;

COMMIT TRAN
事务2
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 作用于整个连接,WITH (NOLOCK) 作用于指定表账户5原始余额 = $35,000
事务1
BEGIN TRAN
UPDATE accounts
SET current_balance = 30000
WHERE account_id = 5;
事务2
...
...
...
SELECT current_balance
FROM accounts WITH (NOLOCK)
WHERE account_id = 5;
| current_balance |
|-----------------|
| 30000,00 |
SQL Server 中的事务与错误处理