分布式 DBA: Cursor Stability Isolation Level 的变化:第 2 部分(理解 Currently Committed 行为)
2010-06-16 00:00:00 来源:WEB开发网启用 Currently Committed 语义行为
在某些环境中用于延迟或避免获取锁的注册表变量
如果事务是并发运行的,可能会发生下面的现象:
DB2_SKIPINSERTED: 允许 CS/RS 扫描忽略未提交插入记录
DB2_SKIPDELETED: 允许 CS/RS 扫描忽略未提交删除记录和索引键
DB2_EVALUNCOMMITTED: 允许 CS/RS 扫描对未提交数据应用和执行可预见性评估;同时允许扫描忽略未提交的删除记录。实际上,它将扫描当作一个 Uncommitted Read,直至它发现一个匹配的记录,这时它可能需要锁定记录以保证只有提交的数据才会被处理/返回。
默认情况下,使用 DB2 9.7 创建的新数据库是启用 CC 语义的。对于升级到 DB2 9.7 的现有数据库,通过将所转换的数据库的配置参数 cur_commit 赋值为 ON 或 AVAILABLE 就可以启用 CC 语义。如果数据库配置参数 cur_commit 被设置为 ON,CC 语义就会应用到整个数据库的 CS 和 RS 隔离。如果数据库配置参数 cur_commit 被设置为 AVAILABLE,DB2 将会把对应的信息存储到锁中,然后执行支持 CC 语义所需要的额外的日志信息(保证所修改记录的日志数据包含了完整未提交版本),但是 CC 语义行为将必须在应用中逐一启用。这可以通过使用 CONCURRENTACCESSRESOLUTION USE CURRENTLY COMMITTED 选项绑定一个嵌入式 SQL 应用到数据库实现,或者通过指定 CLI/ODBC 或 Java 应用的 SQL_ATTR_CONCURRENT_ACCESS_RESOLUTION 连接属性实现。
注意使用 CC 语义需要增加日志空间来存储被定义为 DATA CAPTURE NONE 的表的更新操作。这个额外的空间被用于记录当前事务对一个数据记录的第一次更新操作;这个数据会被用于查询记录行的最新提交镜像。
结束语
DB2 如何确定数据是否已经提交
所示数据记录和索引条目都有一个 “标记” 字节,它包含了一个 “Possibly UNCommitted (PUNC)” 位。如果 PUNC 未设置,数据的记录/索引条目就一定会被提交;否则提交状态就是未知的。
页包含了一个 “pageLSN”,它标识了与页最新修改相对应的日志记录的 LSN。如果 pageLSN 比数据库的 commitLSN 或一个表的 readLSN 旧,那么行/键就保证被提交;否则提交就是未知的。
保持数据的一致性和完整性,同时允许多个事务同时访问相同的数据,这是一个难题,特别是在多用户环境中。事务、隔离级别和锁有助于保持数据的一致性,而 CS 隔离级别的使用越来越多,因为它能够在防止脏读取(即一个事务读取还没有提交的数据)的同时实现最大的并发数。在 DB2 9.7 之前的版本中,使用这种隔离级别可能会由于锁待而增加响应时间。
CC 语义提供了一种全新实现的 CS 隔离级别,它符合 ANSI 的 CS 隔离级别标准。通过 CC 语义,执行读和写操作的事务可以避免未提交插入的锁等待,同时执行只读操作的事务在遇到并发事务的未提交的更新/删除时,不再需要使用锁来等待一个日志读取操作。这个行为实际上保证了应用的响应时间不受锁的影响。
- ››分布式计算多机部署与配置
- ››分布式单词发音抓取机器人
- ››分布式网络爬虫关键技术分析与实现一网络爬虫相关...
- ››分布式 DBA: 创建和使用分区表
- ››分布式 Key-Value 存储系统:Cassandra 入门
- ››分布式 DBA: Cursor Stability Isolation Level 的...
- ››分布式 DBA:存储、I/O 和 DB2,第 1 部分(针对在...
- ››分布式管理:用 HADR 减少停机时间(详细解释如何...
- ››分布式 DBA:使用物化查询表
- ››DBA经验谈:更改数据文件的可用性
- ››分布式存储系统的实现
- ››DBase:DB2必须了解的常用命令及技巧
更多精彩
赞助商链接