南大通用GBase8s 常用SQL语句(260)

GBase 8s 隔离级别 

下列定义说明每一隔离级别的关键特征,从最低隔离级别到最高。

使用 Dirty Read 隔离级别

不论在它们之上是否有锁,都使用 Dirty Read 选项来从数据库复制行。获取行的程序不放置锁且不予考虑。Dirty Read 是不实现会话日志记录的数据库的唯一可用的隔离级别。

此隔离级别最适合于用于数据未被修改的表上的查询的静态表,因为它不提供隔离。通过 Dirty Read,程序可能返回在随后已回滚了的事务之内插入或修改了的未提交的行,或当您首次读查询集时不可见的幻像行,但会在同一事务内随后的读之前在查询集中具体化。(仅 Repeatable Read 隔离级别防止访问幻像行。仅 Dirty Read 提供从并发事务访问未提交的行,这些事务可能随后被回滚。)

当使用 Dirty Read 隔离级别的 DML 操作可能返回未提交的行或幻像行时,可选的 WITH WARNING 关键字指导数据库服务器发出警告。下列示例中的事务使用此隔离级别:

BEGIN WORK;

        SET ISOLATION TO DIRTY READ WITH WARNING;

        ...

        COMMIT WORK;

      

Dirty Read 隔离级别对 USELASTCOMMITTED 配置参数和 USELASTCOMMITTED 会话环境变量的当前设置非常敏感。要获取更多当将隔离级别设置为 DIRTY READ 或 ALL 时 Dirty Read 隔离级别的行为的信息,请参阅 Committed Read 的 LAST COMMITTED 选项。

当您使用“高可用性数据复制”时,数据库服务器有效地使用“HDR 辅助服务器”上的 Dirty Read 隔离,不理会指定的 SET ISOLATION 或 SET TRANSACTION 隔离级别,除非启用 UPDATABLE_SECONDARY 配置参数。要获取关于此主题的更多信息,请参阅 辅助数据复制服务器的隔离级别。

使用 Committed Read 隔离级别

使用 Committed Read 选项来保证在检索行的时刻,每个被检索的行都在表中提交了。此选项不在获取的行上放置锁。Committed Read 是带有不符合 ANSI 的日志记录的数据库中缺省的隔离级别。

当每一行作为独立的单元处理,而不引用同一表中或其他表中的其他行时,Committed Read 是适合的。

Committed Read 的 LAST COMMITTED 选项

使用 Committed Read 隔离级别的 LAST COMMITTED 关键字选项来减小其他会话持有排他的行级锁的风险,该风险会导致应用的锁定错误失败,或直到提交或回滚并发的事务之后应用才能读锁定的行。

在应用尝试读取另一会话在其上持有排他锁的行的上下文中,这些关键字指导数据库服务器返回该行的最近提交的版本,而不是等待该锁被释放。

在下列任何环境之下,此特性隐式地在使用 SET ISOLATION 语句的 Committed Read 隔离级别的,或使用符合 ANSI/ISO 的 SET TRANSACTION 语句的 Read Committed 隔离级别的所有用户会话中生效:

  • 如果 USELASTCOMMITTED 配置参数设置为 'COMMITTED READ' 或 'ALL'
  • 如果 SET ENVIRONMENT 语句将 USELASTCOMMITTED 会话环境变量设置为 'COMMITTED READ' 或 'ALL'。

在下列任何环境之下,此特性还隐式地在使用 SET ISOLATION 语句的 Dirty Read 隔离级别,或使用符合 ANSI/ISO 的 SET TRANSACTION 隔离级别的的所有用户会话中生效:

  1. 如果 USELASTCOMMITTED 配置参数设置为 'DIRTY READ' 或 'ALL'
  2. 如果 SET ENVIRONMENT 语句将 USELASTCOMMITTED 会话环境变量设置为 'DIRTY READ' 或 'ALL'。

启用此特性不可消除锁定冲突的可能性,但它们减少其他会话读取同一行的场景可导致错误的数目。LAST COMMITTED 关键字仅对并发读操作有效。当并发的会话尝试写到同一行时,它们不可防止可发生的锁定冲突或错误。

在表的“最后提交的”版本不可用的上下文中,此特性对 Committed Read 或 Dirty Read 行为无效,包括:

  1. 数据库不支持事务日志记录
  2. 以 LOCK MODE PAGE 关键字创建了的表,或已更改为有一 IFX_DEF_TABLE_LOCKMODE 环境变量的锁模式设置为了 'PAGE'
  3. DEF_TABLE_LOCKMODE 配置参数设置为 'PAGE'
  4. LOCK TABLE 语句已显式地在表上设置了排他锁
  5. 未提交的 DDL 语句已隐式地在表上设置了排他锁
  6. 该表是在其上未提交的 DDL 语句已隐式地设置排他锁的系统目录表
  7. 该表有复合的数据类型的列或用户定义的数据类型的列
  8. 该表为 RAW 表
  9. DataBlade 模块正在访问该表
  10. 使用“虚拟表接口”创建了的表。

不需要用户定义的访问方式来支持 LAST COMMITTED 特性。

LAST COMMITTED 语义的作用域既不是基于语句的,也不是基于事务的。此隔离级别与不带 LAST COMMITTED 选项的 Committed Read 隔离级别有相同的瞬间作用域。例如,当在生效的带有 LAST COMMITTED 的单个事务内执行查询两次时,可能通过相同的查询返回不同的结果,如果在查询的两次提交的间隔之间提交正在相同的数据上操作的其他 DML 事务的话。Committed Read 和 Committed Read Last Committed 语义的此瞬时特性恰好实现 ANSI/ISO Read Committed 隔离级别。

LAST COMMITTED 特性不支持通过表级锁的读取。如果使用 LAST COMMITTED 特性的查询的访问计划遇到它需要访问的表或索引中的表级锁,则该查询会返回下列错误代码:

SQL 错误代码:

252: Cannot get system information for table. 

ISAM 错误代码:

113: ISAM error: the file is locked. 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值