Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1925740
  • 博文数量: 389
  • 博客积分: 7877
  • 博客等级: 少将
  • 技术积分: 4521
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-10 14:02
文章分类

全部博文(389)

文章存档

2024年(1)

2022年(1)

2021年(1)

2020年(1)

2019年(1)

2018年(3)

2017年(6)

2016年(4)

2015年(8)

2014年(15)

2013年(31)

2012年(19)

2011年(47)

2010年(33)

2009年(105)

2008年(109)

2007年(4)

分类:

2011-03-03 20:59:01

db2 v9.7 新特性cur_commit 能够实现未提交读


C:\Users\Administrator>db2 get db cfg|find "CUR_COMMIT"
 当前已落实                                   (CUR_COMMIT) = ON

C:\Users\Administrator>db2 update db cfg using cur_commit off
DB20000I  UPDATE DATABASE CONFIGURATION 命令成功完成。
SQL1363W  未动态更改为立即修改而提交的一个或多个参数。对于这些配置参数,必须在所

有应用程序都与此数据库断开连接之后,更改才会生效。

C:\Users\Administrator>db2 get db cfg|find "CUR_COMMIT"
 当前已落实                                   (CUR_COMMIT) = DISABLED

C:\Users\Administrator>db2 force application all
DB20000I  FORCE APPLICATION 命令成功完成。
DB21024I  此命令为异步的,可能未能立即生效。


---session 1 从tab2表中删除一条记录
C:\Users\Administrator>db2 +c "delete from javan.tab2 where id=3"
DB20000I  SQL 命令成功完成。

C:\Users\Administrator>

---session 2 从tab2表中查 刚才删除的那条记录 会一直等待 知道锁定超时时间到

C:\Users\Administrator>db2 +c "select count(*) from javan.tab2"
SQL0911N  因为死锁或超时,所以当前事务已回滚。原因码为 "68"。  SQLSTATE=40001

C:\Users\Administrator>

我们可以看看锁定的情况
C:\Users\Administrator>db2pd -db testdb -locks

Database Partition 0 -- Database TESTDB -- Active -- Up 0 days 00:07:59

Locks:
Address    TranHdl    Lockname                   Type       Mode Sts Owner
Dur HoldCount  Att        ReleaseFlg rrIID
0x7FB71E80 2          02000800060000000000000052 Row        ..X  G   2        ----------看这里对那条记录id=3 的行 加了row 行级x 排他锁 和s锁是排斥的所以session 2查这条记录 会等待直到超时
1   0          0x00000020 0x40000000 0
0x7FB72380 2          41414141415A425A7F4760B841 Internal P ..S  G   2
1   0          0x00000000 0x40000000 0
0x7FB72300 2          02000800000000000000000054 Table      .IX  G   2
1   0          0x00002000 0x40000000 0


现在我们启用db2 v9.7版本的 未提交读特性

C:\Users\Administrator>db2 update db cfg using cur_commit on
DB20000I  UPDATE DATABASE CONFIGURATION 命令成功完成。
SQL1363W  未动态更改为立即修改而提交的一个或多个参数。对于这些配置参数,必须在所

有应用程序都与此数据库断开连接之后,更改才会生效。

C:\Users\Administrator>db2 get db cfg |find "CUR_COMMIT"
 当前已落实                                   (CUR_COMMIT) = ON

C:\Users\Administrator>

C:\Users\Administrator>db2 connect to testdb

   数据库连接信息

 数据库服务器         = DB2/NT 9.7.1
 SQL 授权标识         = ADMINIST...
 本地数据库别名       = TESTDB


C:\Users\Administrator>db2 get db cfg|find "CUR_COMMIT"
 当前已落实                                   (CUR_COMMIT) = ON

C:\Users\Administrator>


---session 1 删除id=1的记录
C:\Users\Administrator>db2 "select * from javan.tab2 where id=1"

ID          NAME
----------- --------------------
          1 1.25125888zjadolf

  1 条记录已选择。


C:\Users\Administrator>db2 +c "delete from javan.tab2 where id=1"
DB20000I  SQL 命令成功完成。

C:\Users\Administrator>
C:\Users\Administrator>db2pd -db testdb -locks

Database Partition 0 -- Database TESTDB -- Active -- Up 0 days 00:01:56

Locks:
Address    TranHdl    Lockname                   Type       Mode Sts Owner
Dur HoldCount  Att        ReleaseFlg rrIID
0x7FB70980 2          41414141415A425A7F4760B841 Internal P ..S  G   2     
1   0          0x00000000 0x40000000 0
0x7FB72900 2          02000800040000000000000052 Row        ..X  G   2   ---一样的加了x row行级锁
1   0          0x00000020 0x40000000 0
0x7FB71E00 2          02000800000000000000000054 Table      .IX  G   2
1   0          0x00002000 0x40000000 0


---session 2 读取刚才删除id =2的记录
C:\Users\Administrator>db2 +c "select * from javan.tab2 where id=1"

ID          NAME
----------- --------------------
          1 1.25125888zjadolf

  1 条记录已选择。

由于启用了未落实读 ,db2实现了类似oracle中undo 读的功能(虽然实现原理不一样)。
看一下ibm官方文档对 该新特性的描述:“当前已落实”(currently committed semantics,以后会简称 CC)新特性,
该新特性的显著特点是在游标稳定性(Cursor stability,以后会简称 CS)隔离级别时可以明显减少锁等待的出现,以及死锁的出现频率。

数据库配置参数 cur_commit

该数据库配置参数主要是用来控制游标稳定性扫描的行为,默认值为 ON,可选值为:

(1)ON :打开;

对于新创建的数据库,默认值是 ON,在此情况下,当你试图读取一个正在被其他应用程序修改的行时,将直接返回该行的当前已落实版本数据(也就是首次更改之前的值)。

(2)AVAILABLE:可用;

此值表示你的应用需要显式地请求“当前已落实行为”才能得到“当前已落实”结果。

(3)DISABLED:禁用;

如果数据库是从之前的版本升级而来,这个参数将被设置成 DISABLED,这是为了和以前版本的行为保持一致。如果你希望使用当前已落实来控制游标稳定性扫描的行为,需要将这个参数更改成 ON 。

需要注意的是,注册表变量 DB2_EVALUNCOMMITTED、DB2_SKIPDELETED 和 DB2_SKIPINSERTED 在启用 cur_commit 参数后会受到影响。在绑定(BIND)或预编译(PRECOMPILE)时对 CONCURRENTACCESSRESOLUTION 选项指定 USE CURRENTLY COMMITTED 或 WAIT FOR OUTCOME,那么注册表变量 DB2_EVALUNCOMMITTED、DB2_SKIPDELETED 和 DB2_SKIPINSERTED 将被忽略。


阅读(2381) | 评论(0) | 转发(0) |
0

上一篇:X5

下一篇:RHEL 5.5下面部署db2 v9.7 DPF环境

给主人留下些什么吧!~~