事务和OWI
--------------------------------------------------
摘自 高级owi与 oracle性能调整
事务的概要
完整地理解事务,就等于完整的了解了oracle,所以要理解事务,需要理解oracle所提供的控制功能,内部算法
而且,在像
rac这样的多节点环境下,��个节点需要同步,所以其复杂程度超出想象。本章只对理解等待事件引起的
性能问题需要的事务机制进行说明,详细的信息请翻阅参考文献。
用户执行DML(即执行事务)操作在oracle内部如下顺序进行
(1) 相应事务分配回滚段(undo segment),这时优先使用当前联机状态回滚段中一个,回滚段的选择是随机的,若
另外的事务正在使用重试3次,在此过程中失败,则将未联机的回滚段联机后使用。如果此过程也失败,就会创建新的
回滚段,通过这个过程也没有分配到回滚段,则使用oracle8i中使用的回滚段算法(rollback segment),即,使用另外
事务使用中用量最少的回滚段,如果
服务器进程在获得回滚段时没有适当的联机状态的回滚段,则等待enq:US-contention
事件,直到有适当的联机状态的回滚段为止。
(2) 分配回滚段后,在回滚段头上创建事务表 slot(transaction table slot)。
(3) 创建事务表后会生成TXID (Transacion ID),再将此TXID分配给当前事务,TXID通过V$TRANSACION视图的XIDUSN,XIDSLOT
XIDSQN表现,这个值指向分给事务的回滚段头上存在的事务表的准确位置,事务必须在分配撤销区域后得到TXID。
(4) 事务对象的数据块载入到高速缓冲区,在块头的ITL(interested transacion list)上登记事务条目(transaction entry).如果
ITL上没有登记条目所需的空间,直到有空间为止,一直等待ENQ:TX-allocate ITL entry事件。
(5) 将需要修改的块的修改信息存储到PGA,存储名为change vector,修改一行时,一般分别创建undo segmet 头块的(change vector#1),
撤销块(change vector#2),数据块(change vector#3)相应的change vector,进程将pga 的change vector以名为redo record(或redo entry)
复制到重做缓冲区。再负责到重做缓冲区的过程中,需获得redo copy latch,redo allocation latch ,redo writing latch,在此过程
中发生latch争用,分别等待latch:redo copy,redo allocation,latch redo writing事件。
(6) 将此前的块的映像信息(before image)记录到撤销块(undo block),继而修改数据块,被修改的数据块变为脏的状态,而且,高速缓冲区
上创建关于已修改的数据块的CR(consistent read)块,如果需修改的行正在被另外的事务所改变(即修改后事务尚未结束的状态),
就要等待事务结束,此时会等待enq:TX-row lock contention事件。
(7) 执行提交(commit)后给事务分配SCN。提交信息存储在重做缓冲区(redo buffer)
(8) 回滚段头的事务表中存储已成功提交的信息,解除包括TX锁在内的所有资源占用。
(9) 重做缓冲区的内容记录在重做日志文件上,修改的块之后被DBWR记录到数据文件中。