日期:2014-05-16  浏览次数:20706 次

存储过程 设置锁级别set transaction isolation level

语法

SET TRANSACTION ISOLATION LEVEL
????{ READ UNCOMMITTED
????| READ COMMITTED
????| REPEATABLE READ
????| SNAPSHOT
????| SERIALIZABLE
????}
[ ; ]


sql sever中set transaction isolation level属性 - 空想主义者 - 空想主义者的博客 备注

一次只能设置一个隔离级别选项,而且设置的选项将一直对那个连接始终有效,直到显式更改该选项为止。事务中执行的所有读取操作都会在指定的隔离级别的规则下运行,除非语句的 FROM 子句中的表提示为表指定了其他锁定行为或版本控制行为。

事务隔离级别定义了可为读取操作获取的锁类型。针对 READ COMMITTED 或 REPEATABLE READ 获取的共享锁通常为行锁,尽管当读取引用了页或表中大量的行时,行锁可以升级为页锁或表锁。如果某行在被读取之后由事务进行了修改,则该事务会获取一个用于保护该行的排他锁,并且该排他锁在事务完成之前将一直保持。例如,如果 REPEATABLE READ 事务具有用于某行的共享锁,并且该事务随后修改了该行,则共享行锁便会转换为排他行锁。

当事务进行时,您可以随时将事务从一个隔离级别更改为另一个隔离级别。将事务从一个隔离级别更改为另一个隔离级别之后,便会根据新级别的规则对更改后读取的资源执行保护。更改前读取的资源将继续根据先前级别的规则进行保护,例如,一个事务由 REPEATABLE READ 更改为 SERIALIZABLE。由更改前发出的 SELECT 语句读取的行将继续受到行级、页级或表级共享锁的保护。这些锁会继续保持,直至事务结束。由 SELECT 语句在更改后读取的行将受到范围锁的保护。

该表显示事务从一个隔离级别更改为另一个隔离级别时的锁定行为。

?

更改前的隔离级别 更改后的隔离级别

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: