设置隔离级别的示例
设置隔离级别的示例:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT * FROM Products WHERE ProductId=1;
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; --return to the default one
-
READ UNCOMMITTED
- 表示当前事务中的查询无法从另一个尚未提交的事务中访问修改后的数据 - 没有脏读! 但是,不可重复的读取和幻像读取是可能的,因为数据仍然可以被其他事务修改。 -
REPEATABLE READ
- 意味着当前事务中的查询无法从另一个尚未提交的事务中访问修改后的数据 - 没有脏读! 在完成之前,没有其他事务可以修改当前事务正在读取的数据,从而消除了 NONREPEATABLE 读取。但是,如果另一个事务插入 NEW ROWS 并且查询执行了一次以上,那么幻像行可以从第二次读取开始出现(如果它与查询的 where 语句匹配)。 -
SNAPSHOT
- 只能返回查询开头存在的数据。确保数据的一致性。它可以防止脏读,不可重复的读取和幻像读取。要使用它 - 需要 DB 配置:
ALTER DATABASE DBTestName SET ALLOW_SNAPSHOT_ISOLATION ON;GO;
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
READ COMMITTED
- SQL 服务器的默认隔离。它可以防止在提交之前读取由另一个事务更改的数据。它在表上使用共享锁定和行版本控制,以防止脏读。它取决于数据库配置 READ_COMMITTED_SNAPSHOT - 如果启用 - 使用行版本控制。启用 - 使用此:
ALTER DATABASE DBTestName SET ALLOW_SNAPSHOT_ISOLATION ON;GO;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED; --return to the default one
SERIALIZABLE
- 使用获取并保持到事务结束的物理锁,这可以防止脏读,幻读,不可重复读。但是,它会影响 DataBase 的性能,因为并发事务是序列化的并且是逐个执行的。
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE ;