Oracle概念之事务管理.docx
- 文档编号:1783995
- 上传时间:2022-10-24
- 格式:DOCX
- 页数:8
- 大小:21.78KB
Oracle概念之事务管理.docx
《Oracle概念之事务管理.docx》由会员分享,可在线阅读,更多相关《Oracle概念之事务管理.docx(8页珍藏版)》请在冰豆网上搜索。
Oracle概念之事务管理
第四章事务治理
4、事务治理
这一章对事务做了定义以及描述了如何通过事务治理你的工作。
本章包含下列内容:
事务的介绍
事务治理概述
自主事务概述
事务介绍
事务是包含一个多或多个SQL语句的逻辑单位。
一个事务是一个原子单位。
事务中的所有SQL语句只能全部提交(应用到数据库)或者全部回滚(从数据库撤销)。
一个事务从第一个执行的SQL语句开始。
一个事务在它被提交或者被回滚结束,结束事务能够显式的使用COMMIT或者ROLLBACK语句或执行一个DDL语句(隐含着事务结束)。
要讲明事务的概念能够想象一个银行数据库。
当一个银行客户从储蓄帐号中取出钞票到活期帐号中,事务由三个独立的操作组成:
储蓄帐户减值
活期帐户增值
在事务日志中记录事务
Oracle必须适合两种情况。
假如三个SQL语句都按照正确的顺序执行来维护帐号,事务的结果能够应用到数据库中。
尽管如此,假如发生一个帐户资金不足、无效帐号或者硬件错误的问题让事务中的一个或者两个语句没有完成,整个事务必须回滚确保帐户余额是正确的。
图4-1描述了银行事务示例
语句执行和事务操纵
一个成功运行的SQL语句和提交的事务不同。
成功执行意味着单个语句是:
解析
创建有效的SQL结构
作为一个原子单位正确运行。
例如,多行更新的所有行都被修改
尽管如此,在包含语句的事务提交之前,事务差不多上能够回滚的,所有事务做的修改都能够撤销。
一个语句能够成功运行,事务不能(因为事务不是语句,只有开始和结束,只有提交和回滚,没有成功和失败的讲法)。
提交意味着一个用户显示或者隐式的要求事务的变化持久化。
一个显式的请求是当用户执行COMMIT语句时。
一个隐式的请求是应用程序正常结束或者一个DDL操作完成后。
事务包含的SQL语句造成的修改变得持久,并对事务之后的其他用户可见。
事务提交之后执行的SQL能够看到差不多提交的修改。
你能够用SETTRANSACTION.....NAME语句在你开始事务之前设置事务名称。
这使得监控长时刻运行的事务更加容易,解决出现问题的分布式事务也是如此。
语句级不的回滚
假如SQL语句执行的任何时候产生错误,那个语句造成的所有的阻碍都会回滚。
回滚的结果就看起来语句从没有运行过。
那个操作是个语句级不的回滚。
SQL语句执行时遇到的错误导致语句级不回滚。
当向主键内插入重复的数据就会产生如此的错误例子。
死锁(对同一数据的争用)的SQL语句也会导致语句级不的回滚。
假如在SQL语句解析时遇到了错误,比如语法错误,因为还没有运行,因此可不能导致语句级不回滚。
一个SQL语句的失败只会损失它想要的执行的任何工作本身。
可不能导致损失当前事务之前的任何工作。
假如一个语句是DDL语句,然后就会隐含提交还没有撤销的操作(即使那个DDL语句有错误也一样)。
可恢复的空间分配
Oracle提供了一种在空间分配失败事件中暂停、重新启动、执行大的数据库操作的方法。
这使得治理员能够采取正确的动作,而不是Oracle数据库对用户返回一个错误。
在错误环境被纠正之后,暂停的操作自动重新开始。
只有在客户端关于会话使用了ALTERSESSION语句来显示启动重新开始功能之后,一个语句才能在运行在重新开始模式(resumable)下。
当下列情况出现时重新启动的空间分配会暂停:
空间不足
达到最大数据区段
超过空间限额
关于不可重新开始的空间分配,这些情况会导致错误,语句被回滚。
语句的暂停导致事务的暂停。
因而事务的所有资源会在语句暂停和重新启动这段时刻一直持有。
当错误环境过去(例如,用户介入或者其他查询释放了排序空间),暂停的语句自动恢复执行状态。
事务治理概述
Oracle中的第一个执行的SQL语句会开始一个事务。
一个执行的SQL语句是对实例产生调用的一个SQL语句,语句包括DML和DDL语句。
当事务开始时,Oracle对那个事务分配一段可用的undo表空间来保存新事务的重做条目。
一个事务在任一下列情况下终结:
用户提交了不附带SAVEPOINT子句的COMMIT或ROLLBACK语句
用户运行例如CREATE,DROP,RENAME或ALTER的DDL语句。
假如当前事务中包含任何DML语句,Oracle先提交那个事务,然后将那个DDL语句作为一个新的单独的语句事务来运行和提交(注意:
即使那个DDL语句错误也会如此,因为Oracle先提交事务再执行DDL)。
一个用户从Oracle中断连接。
当前的事务被提交。
一个用户进程不正常中断。
当前事务被回滚。
一个事务结束之后,下一个执行的SQL语句自动启动后续的事务。
注意:
应用程序应该在程序中断之前显式的提交或者回滚事务。
提交事务
提交一个事务意味着事务中执行的SQL语句造成的修改持久化。
在一个事务提交修改的数据之前,会发生下列情况:
Oracle差不多产生了undo信息。
Undo信息包含事务中的SQL语句修改的数据的原始值
Oracle差不多在SGA的重做日志缓存中产生重做日志条目。
重做日志记录包含数据块的修改和回滚段的修改信息。
在事务提交之前这些修改会写入磁盘。
修改差不多保存在SGA的数据库缓存中。
这些修改在事务提交之前会写入磁盘。
注意:
提交的事务在SGA中数据库缓存中保存的修改的数据不需要赶忙由后台数据库写入进程(DBWn)写入数据文件。
那个写入会在数据库认为写入效率最高的时候写入。
它可能在事务提交或者事务提交之后一段时刻才写入。
当一个事务被提交,会发生下列情况:
1、相关undo表空间的内部事务表记录事务被提交,事务的唯一系统修改号(SCN)被分配并保存在表中。
2、日志写入进程(LGWR)将SGA的重做日志缓存中的重做日志条目写入重组日志文件。
它还将事务的SCN写入重做日志文件中。
那个原子事件代表了事务的完成。
3、Oracle释放拥有的行和表上的锁
4、Oracle标识事务完成。
注意:
LGWR默认情况下会同步的将重做信息写入在线重做日志文件,事务默认情况下也会等待重做信息写入磁盘,然后将提交返回给客户。
尽管如此,在低事务提交级不的应用程序开发人员能够指定重做信息能够异步写入,而事务也不需要等待重做日志写入磁盘。
回滚事务
回滚的意思是在一个没有提交的事务中撤销其中SQL执行造成的数据修改。
Oracle使用undo表空间(或者回滚段)来保存原始值。
重做日志包含修改的记录。
Oracle能够回滚整个没有提交的事务。
而且也能够回滚到未提交事务中标识为保存点(savepoint)的尾部。
所有类型的回滚都使用同样的过程:
语句级不回滚(语句执行错误或者死锁)
回滚到保存点(savepoint)
依照用户要求回滚
进程意外中断造成的事务回滚
实例意外中断的未决事务回滚
恢复过程中没有完成的事务的回滚
假如不指向任何保存点(savepoint)回滚整个事务,会发生:
1、Oracle使用相关undo表空间来撤销所有SQL语句造成的改变
2、Oracle释放所有数据锁
3、结束事务。
事务保存点
你能够在事务环境中标识叫做保存点的中间标志。
保存点(savepoint)将一个长事务分成多个小部分。
使用保存点,你能够在一个长事务中在任意点标识你的工作。
如此你能够选择回滚事务中当前检查点之前的工作,或者检查点之后的工作。
例如,你能够在执行一系列长的复杂的更新时使用检查点,因此假如你遇到了一个错误,你不需要重新执行所有的语句。
在应用程序开发中保存点也特不有用。
假如一个过程包含多个函数,然后你能够在每个函数开始前设置一个保存点。
如此假如一个函数失败了,你专门容易将数据返回到函数执行前的状态并用不同的参数来执行函数,或者你能够执行一个恢复动作。
回滚一个检查点之后,Oracle会释放回滚语句获得的数据锁。
其他等待锁定资源的事务就能够执行了。
其他打算更新锁定行的事务也能够执行了。
当一个事务回滚到保存点,会发生:
1、Oracle只回滚检查点之后的语句
2、Oracle维护所有的保存点,然而指定保存点之后的所有检查点做的改变都将丢失。
3、Oracle释放那个检查点以来所有需要的表或行锁,然而保留保存点之前需要的所有数据锁。
事务仍然保持活动并能够接着运行。
当一个会话在等待一个事务时,回滚到检查点可不能释放任何行锁。
假如事务没有获得锁,为确保一个事务没有挂起,在UPDATE和DELETE语句前执行FORUPDATE……NOWAIT。
(那个指向差不多回滚的保存点之前获得的锁。
保存点之后的获得的锁都被释放了,因为保存点之后执行的语句都被完全回滚。
)
事务命名
你能够使用一个简单的容易经历的文本字符串命名一个事务。
名字提示了事务是做什么的。
事务命名代替了分布式事务的提交备注,包含下列优点:
专门容易监控长时刻运行的事务和解决有问题的分布式事务
你能够在应用程序中和事务ID一起显示事务名称。
例如,在监控系统活动时,数据库治理员能够在企业治理器中显示事务名称。
事务名称写入到事务审核重做记录中,兼容Oracle9i或更高版本
LogMiner能够使用事务名称在重做日志中搜索特定的事务审核记录
你能够在数据字典视图中使用事务名查找特定的事务,如V$TRANSACTION
事务如何命名
在启动事务之前,使用SETTRANSACTION…NAME语句来命名事务。
当你命名一个事务时,你同时将事务名称和ID做了关联。
事务名称并不需要保证唯一。
同一个用户同时能够拥有同名的不同事务。
你能够使用任何名称来分辨不同的事务。
提交事务
在往常的公布版本中,你能够使用提交备注来对事务进行关联。
尽管如此,一个备注只有在事务提交时才会关联索引。
提交备注在后续版本中仍然支持。
尽管如此,Oracle强烈建议你使用事务名称。
提交备注在命名事务中会被忽略。
两步提交机制
在分布式数据库中,Oracle必须跨网络协调事务操纵以及维护数据完整性。
即使在网络或系统故障的情况下也要做到。
分布式事务指的是包含在分布式数据库上两个或多个节点上运行的一个或多个更新数据的语句的事务。
两步提交确保了参与一个分布式事务的所有数据库服务器的事务完全失败或者完全成功。
两步提交机制还爱护了完整性约束隐含的DML操作、远程过程调用和触发器等。
Oracle的两步提交机制对使用分布式事务的用户来讲是完全透明的。
事实上,用户甚至不需要明白事务是分布式的。
COMMIT语句标识了事务的结束,并自动启动两步提交机制来提交事务。
在数据库应用程序中不需要为包含的分布式事务进行额外的编码或者复杂的语法定义。
后台恢复进程(RECO)自动解决有问题的分布式事务,这些问题事务指的是由于任何缘故的系统或网络故障导致的提交失败。
当故障被修复,通讯重新建立时,每个本地Oracle数据库的RECO进程自动提交和回滚问题进程,从而保证相关节点的一致性。
在长期的故障中,Oracle同意每个本地治理员手工提交或者回滚任何由于故障导致的有问题的分布式事务。
那个选项使得本地数据库治理员能够释放任何由于长时刻故障而造成的锁。
假如一个数据库必须恢复到过去的一个时刻点,Oracle恢复工具能够让其他站点的数据库治理员也恢复他们的数据库到同一的时刻点。
那个操作确保了整体数据库的一致性。
自治事务概述
自治事务是指在一个事务内部调用的独立事务。
一个自治事务能够让你离开调用事务的环境、执行一些SQL操作、提交或者撤销这些操作,然后返回到调用事务的环境,然后接着执行那个事务。
只要开始执行,一个自治事务就完全独立于调用它的主事务。
它看不到主事务的任何未提交的改变、不和注事务共享任何锁和资源。
自治事务产生的改变在自身的提交之后就能够让其他事务看到。
一个自治
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Oracle 概念 事务管理
![提示](https://static.bdocx.com/images/bang_tan.gif)