72.1 设置隔离级别示例
设置隔离级别的示例:
sql
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT * FROM Products WHERE ProductId = 1;
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; -- 恢复默认值
隔离级别说明:
-
READ UNCOMMITTED(未提交读)
当前事务中的查询无法读取其他事务尚未提交的修改,防止脏读;但可能出现不可重复读和幻读,因为其他事务仍可修改数据。
-
REPEATABLE READ(可重复读)
当前事务无法读取其他事务尚未提交的修改,防止脏读;其他事务在当前事务完成前无法修改被读取的数据,从而避免不可重复读;但若其他事务插入新行,再次执行查询可能出现幻读。
-
SNAPSHOT(快照)
只能返回查询开始时已提交的数据,确保一致性;防止脏读、不可重复读和幻读。
使用前先启用数据库选项:
sqlALTER DATABASE DBTestName SET ALLOW_SNAPSHOT_ISOLATION ON; GO SET TRANSACTION ISOLATION LEVEL SNAPSHOT; -
READ COMMITTED(已提交读,默认)
防止读取其他事务未提交的修改;使用共享锁和行版本控制避免脏读。
行为受 READ_COMMITTED_SNAPSHOT 设置影响;若要启用行版本控制:
sqlALTER DATABASE DBTestName SET ALLOW_SNAPSHOT_ISOLATION ON; GO SET TRANSACTION ISOLATION LEVEL READ COMMITTED; -- 恢复默认 -
SERIALIZABLE(可串行化)
使用范围锁,事务结束前锁定所读取的键范围,防止其他事务插入匹配的新行;避免脏读、幻读和不可重复读,但并发性最低,易阻塞,仅必要时使用。
sql
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;