事務標識(xid)解析

redhouser發表於2011-09-20

相關資料中說明事務標識的構成方式為xid=usn.slot.(sqn+1),這三部分組合起來唯一標識系統內的事務。

1,透過xid獲取usn/slot/sqn方式如下:
注意:
*位元組序問題;
*sqn沒有+1

select xid,xidusn,xidslot,xidsqn from v$transaction;
0A001B0034DE0000 10 27 56884

with v as(select '08002A0071CA0000' xid from dual)
select to_number(substr(v.xid,3,2)||substr(v.xid,1,2),'xxxx') usn,
       to_number(substr(v.xid,7,2)||substr(v.xid,5,2),'xxxx') slot,
       to_number(substr(v.xid,15,6)||substr(v.xid,13,2)||substr(v.xid,11,2)||substr(v.xid,9,2),'xxxxxxxxxx') sqn
  from v;
USN SLOT SQN
10 27 56884

2,在v$lock中,使用id1/id2來標識事務。其中:id1的高四位元組為回滾段號,低四位元組為槽號,id2為序號,分別與v$transaction中XIDUSN, XIDSLOT, XIDSQN對應。
select sid,id1,id2 from v$lock where type='TX';
81 1572909 664

with v as (select 1572909 id1,664 id2 from dual)
select trunc(id1/power(2,16)) rbs1,  --截斷獲取高4位元組
       bitand(id1,to_number('ffff0000','xxxxxxxx'))/power(2,16) rbs2, --按位與獲取高4位元組
       to_number(substr(TRIM(to_char(1572909, 'xxxxxxxx')),
                        1,
                        4 - (8 - length(TRIM(to_char(id1, 'xxxxxxxx'))))) ,
                 'xxxx') rbs3 --直接擷取高4位元組
                 ,bitand(id1,to_number('ffff','xxxx')) slot1, ---按位與獲取低4位元組
       mod(id1,power(2,16)) slot2, --求餘獲取低4位元組
       to_number(substr(TRIM(to_char(1572909, 'xxxxxxxx')),
                        5 - (8 - length(TRIM(to_char(id1, 'xxxxxxxx')))),
                        4),
                 'xxxx') slot3,--直接擷取低4位元組
                 id2 from v;
RBS1 RBS2 RBS3 SLOT1 SLOT2 SLOT3 ID2
24 24 24 45 45 45 664

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/18922393/viewspace-707946/,如需轉載,請註明出處,否則將追究法律責任。

相關文章