SET ISOLATION 语句

使用 SET ISOLATION 语句来定义在尝试同时地访问相同行的进程之中的并发程度。

此语句是对 SQL 的 ANSI/ISO 标准的扩展。

语法

用法

SET ISOLATION 语句是对 ANSI SQL-92 标准的 GBase 8s 扩展。SET ISOLATION 语句可更改会话的持久的隔离级别。如果您想要通过符合 ANSI 的语句设置隔离级别,则请改为使用 SET TRANSACTION 语句。要获取这两个语句的对比信息,请参阅 SET TRANSACTION 语句

TO 关键字是可选的,且不起作用。

对于 DIRTY READ(在 SET TRANSACTION 中称为 UNCOMMITTED)、COMMITTED READ 和 REPEATABLE READ(在 SET TRANSACTION 中称为 SERIALIZABLE in SET TRANSACTION)隔离级别,SET ISOLATION 提供与符合 ISO/ANSI 的 SET TRANSACTION 语句相同的功能。

当从数据库检索行时,数据库 isolation_level 影响读并发。隔离级别指定在并发 SQL 事务执行期间可发生的现象。可能发生下列现象:
  • Dirty Read。SQL 事务 T1 修改一行。然后,SQL 事务 T2 在 T1 执行 COMMIT 之前读那行。如果 T1 然后执行 ROLLBACK,则 T2 会读了从未提交的,且可被认为从未存在的一行。
  • Non-Repeatable Read。SQL 事务 T1 读一行。然后 SQL 事务 T2 修改或删除那行并执行 COMMIT。如果 T1 然后尝试重新读那行,则 T1 可能收到修改了的值或发现那行已被删除了。
  • Phantom Row。SQL 事务 T1 读满足某搜索条件的多行 N 的集合。然后 SQL 事务 T2 执行 SQL 语句,该语句生成满足 SQL 事务 T1 所使用的搜索条件的一个或多个新行。如果 T1 然后以相同的搜索条件重复原来的读,则 T1 收到不同的行的集合。

数据库服务器使用分享的锁来支持尝试访问数据的进程中不同的隔离级别。

更新或删除进程在正被修改的行上总是要求排他锁。隔离级别不干扰您正在更新或删除的行。如果另一进程尝试更新或删除您正在以 Repeatable Read 隔离级别读取的行,则拒绝那个进程访问那些行。

GBase 8s ESQL/C 中,当 SET ISOLATION 执行时打开的那些游标检索行时,可能会或可能不会使用新的隔离级别。从打开了游标直到应用存取行这段时间,设置了的任何隔离级别都可能生效。数据库服务器使用在那个时刻生效的隔离级别,可能已经将行读到内部的缓冲区和内部的临时表之内。要确保一致性和可复现的结果,在您执行 SET ISOLATION 语句之前,请关闭任何打开的游标。

仅在打开数据库之后,您才可从客户端计算机发出 SET ISOLATION 语句。