关于rowid的一些说明

  对于表中的每一个数据行来说,rowid是索引用来指向该数据行物理位置的一个信息。

  但是用来加锁的时候,很多时候都是加在了rowid行,无论是对于数据库,还是对于表,还是数据行。

  执行onstat -k命令输出如下:

Locks
address          wtlist           owner            lklist           type     tblsnum  rowid    key#/bsiz
Locks
address          wtlist           owner            lklist           type     tblsnum  rowid    key#/bsiz
441970b0         0                453fdda8           0                HDR+S    100002   204         0       
44197688         0                453fc368           0                    S    100002   204         0       
44197930         0                453fb1e8           0                HDR+S    100002   20a         0       
44198128         0                45401228           0                    S    100002   20a         0       
44198678         0                45400968           0                    S    100002   201         0       
44198a30         0                453fb1e8           4419dd98         HDR+S    a00002   57ea01      0       
44198d60         0                453ff7e8           0                    S    100002   204         0       
44198e70         0                453fb1e8           44197930         HDR+IS   600045   0           0       
4419aa10         0                453fef28           0                    S    100002   204         0       
4419b290         0                453fb1e8           44198e70         HDR+SR   a0000a   57ea01   K- 1       
4419bc20         0                453fc368           44197688         HDR+S    100002   201         0       
4419dd98         0                453fb1e8           4419b290         HDR+SR   a0000a   58e401   K- 1       
4419f140         0                45401228           44198128             S    100002   201         0
  • onstat -k输出中的rowid表示锁加的具体对象,可以是某个数据行的rowid,也可以是某个是索引树对应该数据行的rowid。rowid如果为0,是表锁。如果以两个0结尾,是页锁。如果是6位数字或不以0结尾的6位以下的数字,是行锁。

  • tblsnum=100002 表示数据库锁,后面的rowid就是某个特定是数据库对应的database rowid;

  • tblsnum=600045 表示某个表或索引的rowid

  • database rowid的获取如下:

select name,hex(rowid) from sysmaster:sysdatabases where name=‘dbname’;

  • table rowid的获取如下:

select tabname,hex(partnum),hex(rowid) from sysmaster:systabnames
where dbsname=‘testdb’ and tabname=‘customer’;

  • data row rowid的获取如下:

select hex(rowid),* from tabname where id=‘’;

  • 对于分片表来说,需要使用:

create table … with rowid;
alter table … add rowid;