- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
oracle一个事务的完整流程分析
在oracle客户端与服务端建立连接的,并把请求提交给oracle服务端以前分析过,参考如下:/wyzxg/archive/2010/08/16/5815335.aspx
今天主要分析下oracle服务进程如何处理用户进程的请求oracle服务进程如何处理用户进程的请求
服务器进程在完成用户进程的请求过程中,主要完成如下7个任务:
sql语句的解析
数据块的读入dbbuffer2.记日志
为事务建立回滚段
本事务修改数据块5.放入dirtylist
6.用户commit或rollback
sql语句的解析
下面要讲oracle服务器进程如可处理用户进程的请求,当一用户进程提交一个sql时:updatetempseta=a*2;首先oracle服务器进程从用户进程把信息接收到后,在PGA中就要此进程分配所需内存,存储相关的信息,如在会话内存存储相关的登录信息等;服务器进程把这个sql语句的字符转化为ASCII等效数字码,接着这个ASCII码被传递给一个HASH函数,并返回一个hash值,然后服务器进程将到sharedpool中的librarycache中去查找是否存在相同的hash值,如果存在,服务器进程将使用这条语句已高速缓存在SHAREDPOOL的librarycache中的已分析过的版本来执行,如果不存在,服务器进程将在CGA中,配合UGA内容对sql,进行语法分析,首先检查语法的正确性,接着对语句中涉及的表,索引,视图等对象进行解析,并对照数据字典检查这些对象的名称以及相关结构,并根据ORACLE选用的优化模式以及数据字典中是否存在相应对象的统计数据和是否使用了存储大纲来生成一个执行计划或从存储大纲中选用一个执行计划,然后再用数据字典核对此用户对相应对象的执行权限,最后生成一个编译代码。ORACLE将这条sql语句的本身实际文本、HASH值、编译代码、与此语名相关联的任何统计数据和该语句的执行计划缓存在SHAREDPOOL的librarycache中。服务器进程通过SHAREDPOOL锁存器(sharedpoollatch)来申请可以向哪些共享PL/SQL区中缓存这此内容,也就是说被SHAREDPOOL锁存器锁定的PL/SQL区中的块不可被覆盖,因为这些块可能被其它进程所使用。在SQL分析阶段将用到LIBRARYCACHE,从数据字典中核对表、视图等结构的时候,需要将数据字典从磁盘读入LIBRARYCACHE,因此,在读入之前也要使用LIBRARYCACHE锁存器(librarycachepin,librarycachelock)来申请用于缓存数据字典。
到现在为止,这个sql语句已经被编译成可执行的代码了,但还不知道要操作哪些数据,所以服务器进程还要为这个sql准备预处理数据。
数据块的读入dbbuffer
Oracle处理数据,都需要把数据读取到内存中(即dbbuffer中),首先服务器进程要判断所需数据是否在dbbuffer存在,如果存在且可用,则直接获取该数据,同时根据LRU算法增加其访问计数;如果buffer不存在所需数据,则要从数据文件上读取。首先服务器进程将在表头部请求TM锁(保证此事务执行过程其他用户不能修改表的结构),如果成功加TM锁,再请求一些行级锁(TX锁),如果TM、TX锁都成功加锁,那么才开始从数据文件读数据,在读数据之前,要先为读取的文件准备好buffer空间。服务器进程需要扫面LRUlist寻找freedbbuffer,扫描的过程中,服务器进程会把发现的所有已经被修改过的dbbuffer注册到dirtylist中,
这些dirtybuffer会通过dbwr的触发条件,随后会被写出到数据文件,找到了足够的空闲buffer,就可以把请求的数据行所在的数据块放入到dbbuffer的空闲区域或者覆盖已经被挤出LRUlist的非脏数据块缓冲区,并排列在LRUlist的头部,也就是在数据块放入DBBUFFER之前也是要先申请dbbuffer中的锁存器,成功加锁后,才能读数据到dbbuffer。
记日志
现在数据已经被读入到dbbuffer了,现在服务器进程将该语句所影响的并被读入dbbuffer中的这些行数据的rowid及要更新的原值和新值及scn等信息从PGA逐条的写入redologbuffer中。在写入redologbuffer之前也要事先请求redologbuffer的锁存器,成功加
文档评论(0)