DB2查找阻塞的session

DB2锁分析

下面是一个测试:
session 1:
db2 +c --登陆数据库,这里要加上选项+c,也就是不会做隐式提交事务。否则每执行一条SQL就提交了。
db2 => create table test00(a int, b varchar(10));
DB20000I The SQL command completed successfully.
db2 => commit;
DB20000I The SQL command completed successfully.
db2 => insert into test00 values(1,'AA');
DB20000I The SQL command completed successfully.

接着session 2执行:
db2 => select * from test00;
这时,这个session是hang在那里的。这点与oracle不同的,oracle不阻塞读的,但DB2会阻塞. 接下来就要找到被那个session阻塞。

[@more@]

在另一个窗口里,用DB2的工具db2pd来查看:
LinuxHost 28: db2pd -db sample -locks showlocks wait

Database Partition 0 -- Database SAMPLE -- Active -- Up 1 days 23:20:14 -- Date 11/12/2009 01:44:19

Locks:
Address TranHdl Lockname Type Mode Sts Owner Dur HldCnt Att ReleaseFlg
0x292A0248 2 02000D00040000000000000052 Row .NS W 5 1 0 0x0000 0x00000001 TbspaceID 2 TableID 13 RecordID 0x4
0x2929F898 5 02000D00040000000000000052 Row ..X G 5 1 0 0x0008 0x40000000 TbspaceID 2 TableID 13 RecordID 0x4
这里可以看到有两个事务,都在对象table ID 13将加锁/已加锁,具体是哪个对像可以能过"select tabschema,tabname,tbspace from syscat.tables where tableid=13"来查到。这两个事务,都是对这个对象加得行级锁,事务2加NS(Next Key Share)锁,但状态Sts是W,表明在等待,事务5刚加了独占锁X,状态是G,表明加锁成功。通过这里基本上就可以找到哪个事务阻塞了其它的事务。通过事务ID,可以找到相应的AppHandle:

LinuxHost 29: db2pd -db sample -transactions 2

Database Partition 0 -- Database SAMPLE -- Active -- Up 1 days 23:23:41 -- Date 11/12/2009 01:47:46

Transactions:
Address AppHandl [nod-index] TranHdl Locks State Tflag Tflag2 Firstlsn Lastlsn LogSpace SpaceReserved TID AxRegCnt GXID
0x29229580 1326 [000-01326] 2 5 READ 0x00000000 0x00000000 0x000000000000 0x000000000000 0 0 0x000000001A9F 1 0
--事务2,对应的AppHandle是1326
LinuxHost 30: db2pd -db sample -transactions 5

Database Partition 0 -- Database SAMPLE -- Active -- Up 1 days 23:24:09 -- Date 11/12/2009 01:48:14

Transactions:
Address AppHandl [nod-index] TranHdl Locks State Tflag Tflag2 Firstlsn Lastlsn LogSpace SpaceReserved TID AxRegCnt GXID
0x2922B500 551 [000-00551] 5 3 WRITE 0x00000000 0x00000000 0x00000426E4B9 0x00000426E4B9 108 166 0x000000001AA1 1 0

找到AppHandle/session,就可以分析,相关的事务具体在执行什么:

db2 => get snapshot for application agentid 1326
Application handle = 1326
Application status = Lock-wait
...
Agents waiting on locks = 1
Maximum associated agents = 1
...
Blocking cursor = YES
Dynamic SQL statement text:
select * from test00 --当前正在执行的SQL。
....
ID of agent holding lock = 551 --正在被这个session堵塞了。
Application ID holding lock = *LOCAL.inst.091112064201
Lock name = 0x02000D00040000000000000052
Lock attributes = 0x00000000
Release flags = 0x00000001
Lock object type = Row
Lock mode = Exclusive Lock (X)
Lock mode requested = Next Key Share (NS)
Name of tablespace holding lock = USERSPACE1
Schema of table holding lock = testuser
Name of table holding lock = TEST00
Lock wait start timestamp = 11/12/2009 01:43:42.483704

db2 => get snapshot for application agentid 551;
...
Agents waiting on locks = 0
Maximum associated agents = 1
...
Blocking cursor = NO
Dynamic SQL statement text:
insert into test00 values(1,'AA')--这里的SQL是当前在执行,或刚执行的SQL。有时可能显示的SQL跟db2pd显示的锁的对象没关系.
...

从这里,就完全可以确定是session 551阻塞session 1326.

如果能够通过db2pd把阻塞进程,被阻塞进程的关系非常明显的显示出来就好。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/45188/viewspace-1028677/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/45188/viewspace-1028677/

<think>嗯,用户的问题是关于如何在DB2数据库中查询不包含中文字符的数据。首先,我需要理解用户的需求。他们可能有一个包含各种字符的字段,想要过滤掉那些含有中文的记录。接下来,我得回忆一下DB2中处理字符串和正则表达式的函数。 DB2中常用的字符串匹配方法有LIKE和正则表达式函数。LIKE操作符可能不太够用,因为中文字符范围比较广,使用LIKE的话可能需要多个条件,比如检查每个字符是否不在某个范围内。不过,这样可能会比较繁琐,尤其是对于较长的字符串。 然后想到DB2的REGEXP函数,它支持正则表达式,可以更方便地匹配模式。中文字符的Unicode范围通常在\u4E00到\u9FFF之间,所以正则表达式应该能匹配这个范围内的字符。但需要注意DB2的正则表达式语法是否支持Unicode属性,或者是否需要使用特定的转义序列。 另外,用户提到的引用内容里有一个关于CONTAINS SQL的说明,可能和存储过程有关,但当前问题主要是查询语句,所以可能不太相关。不过引用中提到的使用ROW_NUMBER()的例子,可能对分页有帮助,但当前问题不需要分页。 接下来,我需要确认DB2版本是否支持REGEXP_LIKE函数。根据经验,DB2从某个版本开始支持正则表达式,但具体语法可能有差异。比如,可能需要使用转义字符或者特定的函数参数。 然后,构造正则表达式。要匹配包含中文字符的情况,可以使用[\u4E00-\u9FFF],然后取反。在正则表达式中,取反通常使用^符号,放在字符集开头。因此,正则表达式应为^[^\u4E00-\u9FFF]*$,表示整个字符串中不包含任何中文字符。 但需要测试一下这个正则表达式在DB2中的有效性,可能需要使用转义字符或者不同的语法。例如,DB2可能需要使用UCS2编码或其他方式处理Unicode字符。此外,还要考虑字段的编码是否为支持中文的字符集,比如UTF-8。 另外,如果字段中有NULL值,需要处理,可能需要在WHERE子句中添加条件排除NULL,或者使用COALESCE函数赋予默认值。 然后,给出示例SQL语句,比如SELECT * FROM 表名 WHERE REGEXP_LIKE(字段名, '^[^\u4E00-\u9FFF]*$')。同时提醒用户注意字段的编码和NULL值处理。 最后,生成相关问题,可能涉及性能优化、其他字符过滤方法,或者处理中文字符的其他需求。</think>[用户可见层] 在DB2中查询非中文字符数据的实现方法如下: 1. **使用正则表达式函数** ```sql SELECT * FROM 表名 WHERE REGEXP_LIKE(字段名, '^[^\u4E00-\u9FFF]*$') ``` 2. **LIKE语句变通实现**(适用于不支持正则表达式版本) ```sql SELECT * FROM 表名 WHERE TRANSLATE(字段名, '', '', '') NOT CONTAINING X'4E' TO X'9FFF' ``` 3. **注意事项** - 需要确认字段的字符编码是支持中文的字符集(如UTF-8) - 如果字段允许NULL值,需增加`AND 字段名 IS NOT NULL`条件 - 中文字符的Unicode范围通常为$\u4E00$到$\u9FFF$[^3]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值