事务内部原理:概述
一个事务是当插槽分配在事务表的回滚段头上开始的,这是一个事务物理表现.事务标识符指示了这
个位置.事务标识符有以下的结构:
txid=usn.slot.wrap(回滚段编号.事务插槽ID.SCN wrap
在一个事务插入,更新或删除一个表数据时,一个事务插槽会分配在包含这些行数据的数据块中.
这个事务插槽被用来标记这些行被锁定直到事务被提交或回滚.事务插槽包含事务标识符.
当改变应用到数据块时,重做信息也会生成并存储在回滚段中.事务表插槽包含一个指针指示事务
标识符
事务内部原理:读一致性
为了支持在第一个事务还没有提交时要能让不同会话能读取相同数据块
当读取数据块(可能数据块在缓存中)会话,首先会找到打开的事务插槽.检查事务状态(通过读取
回滚段头)并找出它仍处于活动状态.这意味着会话必须通过活动事务来对数据块第一次被改变
之前的镜像创建一个视图(快照).这就叫作数据块的一致性读取副本,这个副本是通过先复制数据块
的副本然后通过从回滚段中应用重做记录来回滚上次发生的改变.
如果一致性读取要求访问数据块,回滚段头和重做记录.如果它们任何一个有错误都会影响一致性读取.
事务内部原理:锁
为了支持在第一个事务还没有提交时要能让另外的会话改变(更新或删除)被第一个事务所修改的行
新的会话当读取数据块(数据块可能在缓存中)将会找到打开的事务插槽.它将检查事务状态(通过读取
回滚段头)找到它仍处于活动状态.它会告诉会话进程在这种情况下不能继续而要等待其它事务完成(
提交或回滚)
如果必须要读取回滚段头来构建事务插槽的状态.如果回滚段头出现错误那么会影响事务锁
事务内部原理:提交
为了支持现在来提交第一个事务,这个事件会立即被标记为非活动的事务表插槽.
然而直到后来,数据块在事务提交时本身可能没有被更新.这意味着在提交后数据块中的事务插槽可能
仍然处于打开状态.
然而当数据库下次再次读该数据块时,会检查事务表,以前提交的事务会被确认,事务插槽会关闭.
这被称为延迟块清洗.如果回滚段已经被删除了,那么在undo$中的scn记录用来确认提交的事务
数据库读取回滚段头来执行延迟块清洗.如果回滚段出现故障那么会影响延迟块清洗.