对于开发人员来说,我们经常做的是启动一个事务,执行SQL,提交事务。这就完成了我们的工作。但是,就在这些简单的动作背后,网络和数据库都做了些什么呢。我们都想知道。
下面以一个实例来说明。
背景:用户正运行一个连接到Oracle数据库的客户端应用程序,是一个员工档案管理程序。
过程:
1.用户修改了一笔员工档案记录的姓名,并单击了“保存”,这时客户端应用程序通过网络向Oracle服务器进程发送了一条SQL UPDATE语句;
(注:关于客户与服务器的如何连接的过程,将另起篇幅说明。将会涉及到:Oracle Net组件、MTS、监听器、Dispatcher等概念)
2.服务器进程收到UPDATE语句请求以后,在SGA的SQL区中查找同样的语句,如果找到了则执行。否则,服务器进程就检查语句的语法,并对它进行分析,从而以最优的方法执行(这个过程叫做parsing and optimizing)。一旦这个处理完成了以后,这条语句就缓存在SGA的SQL共享区中;
3.服务器进程将原来的员工的、数据拷贝到回滚段(或重做表空间,即undo tablespace,oracle后来的版本增加了Undo tablespace功能,以取待原有的system表空间中的回滚段的功能)。将原来的员工数据拷贝到回滚段中是为了将来用户取消事务而备用的。在这个过程完成之后,服务器进程修改数据库的数据块以改变员工的姓名。修改后的数据库的数据块此时保存在SGA的数据库缓冲区中。
4.服务器进程在SGA日志缓冲区内记录加滚段和数据库块的改变信息。(注意:回滚段的改变也同样要写入日志,因为它也是事务的一部分);
5.客户端的用户提交事务;
6.LGWR(log writer)进程将这个事务的日志信息从日志缓冲区中写入当前的磁盘日志文件中。当操作系统确定写日志文件已经正确完成时,事务才算是提交了。
7.服务器进程向客户发送信息以确认提交。