免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3589 | 回复: 6
打印 上一主题 下一主题

对某行做未commit的update,就不能select 其他行了吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-08-16 17:42 |只看该作者 |倒序浏览
如题,我对表中某行做update(没有commit),得到如下的 lock snapshot锁定列表
锁定对象名          = 3877
节点号锁定被挂起于  = 0
对象类型            = 行
表空间名            = USERSPACE1
表模式              = ADMINISTRATOR
表名                = PROG
节点                = X
状态                = 已授权
锁定逐步升级        = 否

锁定对象名          = 3
节点号锁定被挂起于  = 0
对象类型            = 表
表空间名            = USERSPACE1
表模式              = ADMINISTRATOR
表名                = PROG
节点                = IX
状态                = 已授权
锁定逐步升级        = 否

锁定对象名          = 0
节点号锁定被挂起于  = 0
对象类型            = 内部 P 锁定
表空间名            =
表模式              =
表名                =
节点                = S
状态                = 已授权
锁定逐步升级        = 否


接下去我想对其他行(非update行)做select 操作就不行了,等在那里了,这个时候我得到的lock snapshot是
锁定列表
锁定对象名          = 3
节点号锁定被挂起于  = 0
对象类型            = 表
表空间名            = USERSPACE1
表模式              = ADMINISTRATOR
表名                = PROG
节点                = IS
状态                = 已授权
锁定逐步升级        = 否

锁定对象名          = 0
节点号锁定被挂起于  = 0
对象类型            = 内部 V 锁定
表空间名            =
表模式              =
表名                =
节点                = S
状态                = 已授权
锁定逐步升级        = 否

锁定对象名          = 0
节点号锁定被挂起于  = 0
对象类型            = 内部 P 锁定
表空间名            =
表模式              =
表名                =
节点                = S
状态                = 已授权
锁定逐步升级        = 否


应用程序句柄                    = 8
应用程序 ID                     = *LOCAL.DB2.050816090444
序号                            = 0001
应用程序名                      = db2bp.exe
权限 ID                         = ADMINISTRATOR
应用程序状态                    = UOW 正在等待
状态更改时间                    = 未收集
应用程序代码页                  = 1386
保持的锁定                      = 3
总等待时间(毫秒)              = 未收集

锁定列表
锁定对象名          = 3877
节点号锁定被挂起于  = 0
对象类型            = 行
表空间名            = USERSPACE1
表模式              = ADMINISTRATOR
表名                = PROG
节点                = X
状态                = 已授权
锁定逐步升级        = 否

锁定对象名          = 3
节点号锁定被挂起于  = 0
对象类型            = 表
表空间名            = USERSPACE1
表模式              = ADMINISTRATOR
表名                = PROG
节点                = IX
状态                = 已授权
锁定逐步升级        = 否

锁定对象名          = 0
节点号锁定被挂起于  = 0
对象类型            = 内部 P 锁定
表空间名            =
表模式              =
表名                =
节点                = S
状态                = 已授权
锁定逐步升级        = 否


大家可以告诉我这是为什么吗?还是有什么设置不对?谢谢

论坛徽章:
0
2 [报告]
发表于 2005-08-17 00:21 |只看该作者

对某行做未commit的update,就不能select 其他行了吗?

update进行行锁,这时可以查询其它的记录。

论坛徽章:
0
3 [报告]
发表于 2005-08-17 15:26 |只看该作者

对某行做未commit的update,就不能select 其他行了吗?

把锁的级别降下来呢?

论坛徽章:
0
4 [报告]
发表于 2005-08-19 11:09 |只看该作者

对某行做未commit的update,就不能select 其他行了吗?

把表级锁改为行级锁

论坛徽章:
0
5 [报告]
发表于 2005-08-19 14:08 |只看该作者

对某行做未commit的update,就不能select 其他行了吗?

try this:
select * from TABLE with ur

论坛徽章:
0
6 [报告]
发表于 2005-08-23 16:30 |只看该作者

对某行做未commit的update,就不能select 其他行了吗?

我加了索引就没有这个问题了

论坛徽章:
0
7 [报告]
发表于 2005-08-24 17:34 |只看该作者

对某行做未commit的update,就不能select 其他行了吗?

select之所以出不来,是进行表扫描的时候,扫描到更改的行,被锁住,加适当的索引走索引扫描可以避免这个,如果update的列是索引中的列,就不能避免。
另外,可以设置一个db2参数避免这个问题:
>; 对于db2的更改db2中有一个设置可以加强db2的访问并发性,针对where条件中的谓词做判断。
>;
>; DB2_EVALUNCOMMITTED:默认设置为false,设置为true可以增强并发性。
>;
>; 例如:
>; 当DB2_EVALUNCOMMITTED=false
>; 假设原来表中有记录11
>; session A:
>; db2 +c "insert into tab values(22)
>; session B:
>; db2 select * from tab;锁住
>; db2 select * from tab where col = 11;锁住
>;
>; 当DB2_EVALUNCOMMITTED=true
>; session A:
>; db2 +c "insert into tab values(22)
>; session B:
>; db2 select * from tab;锁住
>; db2 select * from tab where col = 11;
>; 将可以出来结果
>;
>; 这个设置的作用是比较where中的条件和更改记录,如果更改记录不在选择的结果集中,则返回结果。
这是db2set中的参数,所以需要restart instance
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP