|
那我们来看一看同样这三个实验在DB2中会有什么结果(将DB2命令行处理器的自动提交设为否)
DB2SET DB2OPTIONS=-c-
同样有表TEST(ID NUM(10,0))
有50000条记录,值是从1到50000
第一个大SELECT,小UPDATE
A会话----Select * from test;设执行时间09:10:11
B会话-----Update test set id=99999 where id=50000----设执行时间09:10:12
我的实验结果是B会话先完成,如果B会话不COMMIT,那么A的会话将永远不会结束,在显示到47767时停止运行,我想是由于B会话锁定了ID=50000所在页的原因,使得A会话无法锁定页而进入等待状态,(ORACLE不存在这个问题,它是从回滚段中读取的,以上已有详细说明)。正是由于DB2没有回滚段来提供一致性读视图而影响了DB2的并发,难道不是吗?如果一个用户一个月不COMMIT,那么所有SELECT这张表的用户都要等待,这也叫好的并发吗?
如果B会话在A会话读到最后一页之前COMMIT,则A会话可以完成,但是所显示的最后一个值是99999(与ORACLE不同,ORACLE仍然显示的是50000),从这里我们可以说DB2的读稳定性隔离级没有提供事务的高度隔离,(ORACLE可以真正提供基于一个时间点的状态值,而不受其它的影响)。DB2正是没有回滚段来提供一致性读才使用可重复读隔离级来阻止幻像读.
二、大UPDATE,小SELECT
A会话----Update test set id=1;----设执行时间09:10:11
B会话-----select * from test where id=50000----设执行时间09:10:12
我们会发现B会话会永远也不会完成,除非A会话COMMIT,如果A会话忘了COMMIT,B会话的活还干不干了,这是不是影响并发?
三、大UPDATE,小UPDATE
第三个实验做不下去了,因为跟第二个同样的原因,A会话在COMMIT或ROLLBACK之前,B会话只有等 |
|