SQL SERVER隔离语句如下:
SET TRANSACTION ISOLATION LEVEL
{ READ UNCOMMITTED
| READ COMMITTED
| REPEATABLE READ
| SNAPSHOT
| SERIALIZABLE
}
[ ; ]
一次只能设置一个隔离级别选项,而且设置的选项将一直对那个连接始终有效,直到显式更改该选项为止。事务中执行的所有读取操作都会在指定的隔离级别的规则下运行,除非语句的 FROM 子句中的表提示为表指定了其他锁定行为或版本控制行为。
事务从一个隔离级别更改为另一个隔离级别时的锁定行为如下表:
READ UNCOMMITTED | READ UNCOMITTED: 未更改。 READ COMMITTED: 该行为取决于 READ_COMMITTED_SNAPSHOT 数据库选项的设置: 如果为 OFF,事务将获取共享锁,并在读取期间保留锁。 如果为 ON,事务会使用行版本控制。 SNAPSHOT: 事务必须已作为 SNAPSHOT 启动。事务将会失败,并将回滚所有更改。 REPEATABLE READ: 现在该事务将获取共享锁,并在事务期间保留锁。 SERIALIZABLE: 现在该事务将获取范围锁,并在事务期间保留锁。 |
READ COMMITTED | READ UNCOMITTED: 事务不再获取用于读取操作的锁。 READ COMMITTED: 未更改。 SNAPSHOT: 事务必须已作为 SNAPSHOT 启动。事务将会失败,并将回滚所有更改。 REPEATABLE READ: 现在该事务将获取共享锁,并在事务期间保留锁。 SERIALIZABLE: 现在该事务将获取范围锁,并在事务期间保留锁。 |
SNAPSHOT | READ UNCOMITTED: 事务不再使用行版本控制,并且不再获取用于读取操作的锁。 READ COMMITTED: 该行为取决于 READ_COMMITTED_SNAPSHOT 数据库选项的设置: 如果为 OFF,事务将获取共享锁,并在读取期间保留锁。 如果为 ON,事务会使用行版本控制。 SNAPSHOT: 未更改。 REPEATABLE READ: 该事务不再使用行版本控制。现在它获取了共享锁,并在事务执行期间一直保持该锁。 SERIALIZABLE: 该事务不再使用行版本控制。现在它获取了范围锁,并在事务执行期间一直保持该锁 |
REPEATABLE READ | READ UNCOMITTED: 该事务在读取操作时不再获取锁。在 REPEATABLE READ 下获取的共享锁保留到事务结束。 READ COMMITTED: 该行为取决于 READ_COMMITTED_SNAPSHOT 数据库选项的设置: 如果为 OFF,事务将获取共享锁,并在读取期间保留这些新锁。 如果为 ON,事务会使用行版本控制。 在 REPEATABLE READ 下获取的共享锁保留到事务结束。 SNAPSHOT: 事务必须已作为 SNAPSHOT 启动。事务将会失败,并将回滚所有更改。 REPEATABLE READ: 未更改。 SERIALIZABLE: 现在该事务将获取范围锁,并在事务期间保留锁。在 REPEATABLE READ 下获取的共享锁保留到事务结束。 |
示例代码如下:
USE AdventureWorks;
GO
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
GO
BEGIN TRANSACTION;
GO
SELECT *
FROM HumanResources.EmployeePayHistory;
GO
SELECT *
FROM HumanResources.Department;
GO
COMMIT TRANSACTION;
GO