模拟bitmap index 环境下死锁的出现
session 1
SQL> select sid from V$mystat where rownum = 1;
SID
----------
1
SQL> create table test_bitmap
2 (field varchar2(5));
Table created.
SQL> create bitmap index test_bitmap_idx on test_bitmap(field);
Index created.
SQL> insert into test_bitmap
2 values ('F');
1 row created.
session 2
SQL> select sid from V$mystat where rownum = 1;
SID
----------
30
SQL> insert into test_bitmap
2 values('T');
1 row created.
SQL> insert into test_bitmap
2 values('F');
#执行完这些语句后,去session 1执行 另外一条insert语句。
insert into test_bitmap
*
ERROR at line 1:
ORA-00060: deadlock detected while waiting for resource
session 1
SQL> insert into test_bitmap
2 values('T');
^Cinsert into test_bitmap
*
ERROR at line 1:
ORA-01013: user requested cancel of current operation
该insert 语句会一直等待,所以我取消了。
session1 插入记录以后位图如下,同时session1 锁定了bit-map index中的F值列。
row field F
1 F 1
session2 第一次插入记录以后位图如下,同时session2 锁定了bit-map index中的T值列。
row field F T
1 F 1 0
2 T 0 1
session2 第二次插入记录以后理想情况下位图是下面这样子的,但是因为session1 锁住了bit-map index中的F值列,所以session 2 卡在那边,一直在waiting。。。。请求session1 的锁。
row field F T
1 F 1 0
2 T 0 1
3 F 1 0
现在在session1 中发出的语句请求session 2的锁。这时候资源请求的循环链构成了,出现死锁oracle 探测到并报错。
row field F T
1 F 1 0
2 T 0 1
3 F 1 0
4 T 0 1
注:红色部分实际上并不存在于位图索引中,是为了说明理想情况下应该存在而引入的。