用户会话只是用户到数据库的一个连接,而用户对数据库的操作则是通过会话中的一个个事务来进行的。对事务的管理不仅仅是DBA的任务,每个发布事务的用户也能够对自已的事务进行管理。
事务的开始:
Oracle中的事务由遇到的第一条可执行SQL语句开始。
DDL (Data Definition Language)
DML(Data Manipulation Language )
事务的结束:
·用户执行commit或rollback语句
·用户执行一条DDL语句,比如create,drop,rename,alter。如果当前事务中包含有已经执行的DML语句,Oracle首先提交事务,然后再将DDL语句作为一个新的只包含一条语句的事务执行并提交。
·用户主动断开到oracle的连接。
·用户进程意外中止。
提交事务前完成的工作:
·在SGA区的回退缓存中生成该事务的回退条目。在回退条目中保存有该事务所修改的数据的原始版本。
·在SGA区的重做日志缓存中生成该事务的重做记录。重做记录中记载了该事务对数据块所进行的修改,并且还记载了对回退段中的数据块所进行的修改。缓存中的重做记录有可能在事务提交之前就写入硬盘中。
·在SGA区的数据库缓丰中记录了事务对数据库所进行的修改。这些修改也有可能在事务提交之前就写入硬盘中。
提交事务时完成的工作:
·在为该事务指定的回退段中的内部事务表内记录下这个事务已经被提交,并且生成一个惟一的SCN记录在内部事务表中,用于惟一标识这个事务。
·LGWR后进进程将SGA区重做日志缓存中的重做记录写入联机重做日志文件。在写入重做日志的同时还将写入该事务的SCN。
·Oracle服务进程释放事务所使用的所有记录锁与表锁。
·Oracle通知用户事务提交完成。
·Oracle将该事务标记为已完成。
回退事务完成的工作:
·Oracle通过使用回退段中的回退条目,撤销事务中所有SQL语句对数据库所做的修改。
·Oracle服务进程释放事务所使用的所有锁
·Oracle通知事务回退成功。
·Oracle将该事务标记为已完成
事务的隔离等级:
(servers=dedicated)
set transaction isolation level read committed
set transaction isolation level serializable
set transaction read only
set transaction read write
alter session set isolation_level=serializable
alter session set isolation_level=read commited
读一致性的工作机制:
设定查询语句的SCN:10023
该查询语句在搜索所需要的数据块时,
如果所需数据块的SCN<=10023,则读取。
如果所需数据块的SCN>10023,查询语句将从回退段中获取对应的数据块的原始版本(原始版本的SCN同样要<=10023)
这样,通过对数据块的SCN进行比较,查询语句将只返回在它开始执行之前已经提交的数据,保证了不会读取到未提交事务所修改的脏数据块,也不会读取到语句开始执行后再提交的数据块。
定义私有回退段
set transaction use rollback segment XXX