语法
SET TRANSACTION ISOLATION LEVEL
{ READ UNCOMMITTED
| READ COMMITTED
| REPEATABLE READ
| SNAPSHOT
| SERIALIZABLE
}
[ ; ]
|
备注
一次只能设置一个隔离级别选项,而且设置的选项将一直对那个连接始终有效,直到显式更改该选项为止。事务中执行的所有读取操作都会在指定的隔离级别的规则下运行,除非语句的
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:
未更改。
SERIALIZABLE:
现在该事务将获取范围锁,并在事务期间保留锁。在 REPEATABLE READ
下获取的共享锁保留到事务结束。
|
SERIALIZABLE
|
READ UNCOMITTED:
该事务在读取操作时不再获取锁。在 SERIALIZABLE 下获取的范围锁保留到事务结束。
READ COMMITTED:
该行为取决于 READ_COMMITTED_SNAPSHOT 数据库选项的设置:
如果为 OFF,事务将获取共享锁,并在读取期间保留这些新锁。
如果为 ON,事务会使用行版本控制。
在 SERIALIZABLE 级别下获取了范围锁,并且该锁一直保持到事务结束。
SNAPSHOT:
事务必须已作为 SNAPSHOT 启动。事务将会失败,并将回滚所有更改。
REPEATABLE READ:
现在,事务获取了共享锁,并在事务执行期间一直保持该锁。在 SERIALIZABLE
下获取的范围锁保留到事务结束。
SERIALIZABLE:
未更改。
|
如果在存储过程、触发器、用户定义函数或用户定义类型中发出 SET TRANSACTION
ISOLATION LEVEL,则当对象返回控制时,隔离级别会重设为在调用对象时有效的级别。例如,如果在批处理中设置 REPEATABLE
READ,并且该批处理调用一个将隔离级别设置为 SERIALIZABLE 的存储过程,则当该存储过程将控制返回给该批处理时,隔离级别就会恢复为
REPEATABLE READ。
当您使用 sp_bindsession 绑定两个会话时,每个会话都会保留它自身的隔离级别设置。使用
SET TRANSACTION ISOLATION LEVEL 更改某个会话的隔离级别设置时,不会影响与该会话绑定的其他任何会话的设置。
SET TRANSACTION ISOLATION LEVEL
会在执行或运行时生效,而不是在分析时生效。
对表执行的优化大容量导入操作会阻塞在下列隔离级别下运行的查询:
SNAPSHOT
READ
UNCOMMITTED
使用行版本控制的 READ
COMMITTED
反之,在这些隔离级别下运行的查询也会阻塞优化大容量导入操作。
参数
READ UNCOMMITTED
指定语句可以读取已由其他事务修改但尚未提交的行。
在 READ UNCOMMITTED
级别运行的事务,不会发出共享锁来防止其他事务修改当前事务读取的数据。READ UNCOMMITTED
事务也不会被排他锁阻塞,排他锁会禁止当前事务读取其他事务已修改但尚未提交的行。设置此选项之后,可以读取未提交的修改,这种读取称为脏读。在事务结束之前,可以更改数据中的值,行也可以出现在数据集中或从数据集中消失。该选项的作用与在事务内所有
SELECT 语句中的所有表上设置 NOLOCK 相同。这是隔离级别中限制最少的级别。
在 SQL Server 2005
中,您还可以使用下列任意一种方法,在保护事务不脏读未提交的数据修改的同时尽量减少锁定争用:
READ COMMITTED 隔离级别,并将
READ_COMMITTED_SNAPSHOT 数据库选项设置为 ON。
SNAPSHOT 隔离级别。
READ COMMITTED
指定语句不能读取已由其他事务修改但尚未提交的数据。这样可以避免脏读。其他事务可以在当前事务的各个语句之间更改数据,从而产生不可重复读取和幻像数据。该选项是
SQL Server 的默认设置。
READ COMMITTED 的行为取决于 READ_COMMITTED_SNAPSHOT
数据库选项的设置:
如果将 READ_COMMITTED_SNAPSHOT 设置为
OFF(默认设置),则数据库引擎 会使用共享锁防止其他事务在当前事务执行读取操作期间修改行。共享锁还会阻止语句在其他事务完成之前读取由这些事务修改的行。语句完成后便会释放共享锁。
如果将
READ_COMMITTED_SNAPSHOT 设置为
ON,则数据库引擎 会使用行版本控制为每个语句提供一个在事务上一致的数据快照,因为该数据在语句开始时就存在。不使用锁来防止其他事务更新数据。
当 READ_COMMITTED_SNAPSHOT 数据库选项设置为 ON 时,您可以使用
READCOMMITTEDLOCK 表提示为 READ_COMMITTED
隔离级别上运行的事务中的各语句请求共享锁,而不是行版本控制。
REPEATABLE READ
指定语句不能读取已由其他事务修改但尚未提交的行,并且指定,其他任何事务都不能在当前事务完成之前修改由当前事务读取的数据。
对事务中的每个语句所读取的全部数据都设置了共享锁,并且该共享锁一直保持到事务完成为止。这样可以防止其他事务修改当前事务读取的任何行。其他事务可以插入与当前事务所发出语句的搜索条件相匹配的新行。如果当前事务随后重试执行该语句,它会检索新行,从而产生幻读。由于共享锁一直保持到事务结束,而不是在每个语句结束时释放,所以并发级别低于默认的
READ COMMITTED 隔离级别。此选项只在必要时使用。
SNAPSHOT
指定事务中任何语句读取的数据都将是在事务开始时便存在的数据的事务上一致的版本。事务只能识别在其开始之前提交的数据修改。在当前事务中执行的语句将看不到在当前事务开始以后由其他事务所做的数据修改。其效果就好像事务中的语句获得了已提交数据的快照,因为该数据在事务开始时就存在。
除非正在恢复数据库,否则 SNAPSHOT 事务不会在读取数据时请求锁。读取数据的 SNAPSHOT
事务不会阻止其他事务写入数据。写入数据的事务也不会阻止 SNAPSHOT 事务读取数据。
在数据库恢复的回滚阶段,如果尝试读取由其他正在回滚的事务锁定的数据,则 SNAPSHOT
事务将请求一个锁。在事务完成回滚之前,SNAPSHOT 事务会一直被阻塞。当事务取得授权之后,便会立即释放锁。
必须将 ALLOW_SNAPSHOT_ISOLATION 数据库选项设置为 ON,才能开始一个使用
SNAPSHOT 隔离级别的事务。如果使用 SNAPSHOT 隔离级别的事务访问多个数据库中的数据,则必须在每个数据库中将
ALLOW_SNAPSHOT_ISOLATION 都设置为 ON。
不能将通过其他隔离级别开始的事务设置为 SNAPSHOT 隔离级别,否则将导致事务中止。如果一个事务在
SNAPSHOT 隔离级别开始,则可以将它更改为另一个隔离级别,然后再返回 SNAPSHOT。一个事务从执行 BEGIN TRANSACTION
语句开始。
在 SNAPSHOT 隔离级别下运行的事务可以查看由该事务所做的更改。例如,如果事务对表执行
UPDATE,然后对同一个表发出 SELECT 语句,则修改后的数据将包含在结果集中。
SERIALIZABLE
指定:
语句不能读取已由其他事务修改但尚未提交的数据。
任何其他事务都不能在当前事务完成之前修改由当前事务读取的数据。
在当前事务完成之前,其他事务不能使用当前事务中任何语句读取的键值插入新行。
范围锁处于与事务中执行的每个语句的搜索条件相匹配的键值范围之内。这样可以阻止其他事务更新或插入任何行,从而限定当前事务所执行的任何语句。这意味着如果再次执行事务中的任何语句,则这些语句便会读取同一组行。在事务完成之前将一直保持范围锁。这是限制最多的隔离级别,因为它锁定了键的整个范围,并在事务完成之前一直保持范围锁。因为并发级别较低,所以应只在必要时才使用该选项。该选项的作用与在事务内所有
SELECT 语句中的所有表上设置 HOLDLOCK 相同。
分享到:
相关推荐
在MySQL中,可以通过`SET TRANSACTION ISOLATION LEVEL`语句来改变当前会话的事务隔离级别。例如,要设置为读已提交,可以执行: ```sql SET TRANSACTION ISOLATION LEVEL READ COMMITTED; ``` 而要恢复到默认的可...
在Oracle中,可以使用`SET TRANSACTION ISOLATION LEVEL`语句来显式地设置事务的隔离级别。例如: ```sql SET TRANSACTION ISOLATION LEVEL READ COMMITTED; ``` 或者在会话级别设置: ```sql ALTER SESSION SET ...
设置SQL Server的事务隔离级别可以使用`SET TRANSACTION ISOLATION LEVEL`命令,后面接上对应的隔离级别名称。例如,设置为读已提交级别可以使用`SET TRANSACTION ISOLATION LEVEL READ COMMITTED`。 在实验环境中...
SET TRANSACTION [ISOLATION LEVEL level] [READ ONLY | READ WRITE]; ``` - **示例**: - 设置事务为只读: ```sql SQL> set transaction readonly; ``` - 设置事务为读写,默认情况: ```sql SQL> set ...
总之,MySQL 的事务隔离机制允许用户根据需要选择合适级别的隔离,同时提供了 `SET TRANSACTION ISOLATION LEVEL` 命令和 Spring 的 `@Transactional` 注解来灵活配置,以保证数据的一致性和应用的性能。对于开发者...
例如,在MySQL中,可以使用`SET TRANSACTION ISOLATION LEVEL`语句来设置,而在SQL Server中,可以通过`SET TRANSACTION ISOLATION LEVEL`或在连接字符串中指定。 查看当前事务隔离级别的方法也是数据库系统特定的...
事务隔离级别设置 set global transaction isolation level read committed; //全局的 set session transaction isolation level read committed; //当前会话 修改事务提交方式(是否自动提交,mysql默认自动提交...
第一部分、SQL&PL/SQL [Q]怎么样查询特殊字符,如通配符%与_ ...[A]set transaction [isolation level] read committed; 默认语句级一致性 set transaction [isolation level] serializable; read only; 事务级一致性
SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED 说明:如果指定GLOBAL,那么定义的隔离级将适用于所有的SQL用户;如果指定SESSION,则...
SQL Server 2000中的事务可以通过`SET TRANSACTION ISOLATION LEVEL`语句来设定隔离级别。例如,以下代码将当前会话的隔离级别设置为可重复读: ```sql SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; ``` 通过...
在SQL SERVER中,你可以通过`SET TRANSACTION ISOLATION LEVEL`语句设置当前会话的事务隔离级别。例如,要设置为可重复读,可以执行`SET TRANSACTION ISOLATION LEVEL REPEATABLE READ`。 2. **ORACLE**: - 默认...
mysql> set session transaction isolation level read committed; Query OK, 0 rows affected (0.00 sec) ``` InnoDB 的可重复读隔离级别和其他数据库的可重复读是有区别的,不会造成幻象读。这是因为 InnoDB 使用...
SET session TRANSACTION ISOLATION LEVEL READ COMMITTED; ``` 解锁锁定的表有两种方式: 1. 使用`SHOW PROCESSLIST`找出锁定的进程ID,然后执行`KILL id;`来终止该进程。 2. 直接使用`UNLOCK TABLES;`命令解锁...
例如,设置事务为读已提交(read committed)模式:`set transaction isolation level read committed;` 这是默认级别,而`set transaction isolation level serializable;` 设置为串行化级别,提供了最高级别的隔离...
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; ``` 查看当前的事务隔离级别,可以使用: ```sql SELECT @@tx_isolation; ``` 4. **教学方法** 教授事务隔离级别时,可以结合理论讲解和实践操作。使用...
2. **设置事务隔离级别**:使用`SET TRANSACTION ISOLATION LEVEL`命令来设置,例如`SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;`。 3. **解决中文乱码**:设置字符集,如在配置文件中设置`character...
可以通过`SET TRANSACTION ISOLATION LEVEL`语句来设置当前会话的事务隔离级别。此外,InnoDB还提供了一些特定的特性,如Next-Key Locks,以帮助解决幻读问题,特别是在可重复读隔离级别下。 总结起来,理解并合理...
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE; ``` #### 存储过程 ##### 6.2.1 创建存储过程 存储过程是一组预编译好的SQL语句,它们可以作为单个单元存储在数据库服务器上并作为一个单元执行。创建...
可以通过`SET TRANSACTION ISOLATION LEVEL`语句来改变当前会话的事务隔离级别。 **SQL锁** SQL Server中的锁用于管理多个用户对同一数据的并发访问,防止数据不一致。主要有以下几种类型: 1. **行锁(Row Locks...