笔记
1. 开发数据库应用,不能把数据库当黑盒。需要了解数据库的一下内容
2. 我的方法
以数据库为中心的方法.如果能在数据库中实现,就不去自己实现. 原因是Oracle在各种平台上都可用,自己实现的话,移植性可能会不好.
一些最佳实践
3. 一个bitmap index引起阻塞的问题
自治事务
自治事务就是在一个已有的会话中开始一个独立的子事务,父事务被阻塞。通常用在测试中。
举一个位图索引导致的阻塞问题
先看位图索引的结构
比如拿 gender作例子,values=M or F, 建立bitmap index
假设表里有5条记录,那么位图中的bit数就是5
John, M,25, L1
Diana, F, 20, L2
Mary, F, 21, L1
Peter, M, 26, L4
Kathy, F, 33,L3
那么M的位图就是10010, F的位图就是01101. 如果bitmap index在列上, 那么L1=10100, L2=01000
那么如果在下面会话中打开一个自治事务,就会发生死锁。
ops$tkyte%ORA11GR2>>> create table t 2 ( processed_flag varchar2(1) 3 ); Table created. ops$tkyte%ORA11GR2> create bitmap index 2 t_idx on t(processed_flag); Index created. ops$tkyte%ORA11GR2> insert into t values ( ‘N‘ ); 1 row created. ops$tkyte%ORA11GR2> declare 2 pragma autonomous_transaction; 3 begin 4 insert into t values ( ‘N‘ ); 5 commit; 6 end; 7 / declare * ERROR at line 1: ORA-00060: deadlock detected while waiting for resource ORA-06512: at line 4
如果打开一个新的会话,同样插入值=N的行,那么这个会话会被阻塞,因为会话1已经锁定了Value=N的位图索引。
解决办法就是删除这个bitmap index.
4. 开发数据库应用的正确方法
01 - 开发成功的Oracle应用,布布扣,bubuko.com
原文:http://www.cnblogs.com/xzpp/p/3603154.html