Oracle的事务


数据存储的逻辑单位是数据块,数据操作的逻辑单位是事务。


事务(transaction)是用户定义的一组操作序列,由一条或多条相关SQL语句组成,是数据库应用程序的基本逻辑单位。一般来讲,一个应用程序是由一个或多个事务组成的。


事务处理是所有RDBMS(当然包括Oracle)的核心。事实上,没有事务处理,就没有RDBMS实现的可能性。事务管理技术主要包括数据库的恢复技术和并发控制技术。数据库恢复技术和并发控制技术是RDBMS的重要组成部分。


数据库的一大特点就是数据共享,但数据共享必然带来数据的安全问题。数据的安全保护措施是否有效,是数据库的主要性能指标之一。对数据的保护包含两个方面的内容:


  • 防止非法用户的操作对数据库造成故意的破坏。如,非法地修改数据、非法地窃取数据。

  • 防止合法用户的操作对数据库造成意外的破坏。如,防止有逻辑关系的一组DML操作半途而废或由于并发存取而导致的对教据一致性的破坏,由于更新数据而导致的对数据完整性的破坏或由于故障而导致的数据破坏等。


    对于前者来说,可以用用户管理、权限管理等方法来控制;对于后者来说,Oracle提供了一种被称为“事务”的控制机制,能够对数据进行有效、安全的操作,使数据库中的数据始终处于一个数据一致性的状态。


根据ANSI/ISO SQL标准,事务是用户定义的一组操作序列,由一条或多条相关的SQL语句组成,是数据库应用程序的基本逻辑单位。


事务与应用程序是两个不同的概念。通常情况下,一个应用程序包括多个事务。


从日常生活中理解事务其实就是一个很简单的概念。例如,商业活动中的交易都涉及两个基本操作:一手交钱一手交货。这两个操作构成了一个完整的交易,缺一不可。即,如果这两个操作都成功了,则交易成功:如果任何一个不成功,则交易失败,就应该取消该交易,将钱或货归还到原来人的手中,恢复交易前的状态。


事务的另一个例子是银行转账。银行中有AB两个账号,现在要从A账号取出1万元,存入B账号。为了使数据处于一致性的状态,就需要定义一个包括两个操作的事务,第一个操作是从A账号中取出1万元,第二个操作是向B账号中存人1万元。显然,这两个操作要么全做,要么全不做。全做或者全不做,都不会违反银行的“有借必有贷,借贷必相等”的记账原则。如果半途而废,就应该取消转账,恢复账号原来的数据状态。


在数据库中,将钱从一个银行账号中转到另一个银行账号通常分为两步操作:一条UPDATE语句将账号A的余额减去转移的金额amount,另一条UPDATE语句将账号B的余额增加转移的金额amount。显然,这两个UPDATE语句要么同时成功,要么全部撤销,杏则就会有一部分钱丢失。即违反了银行的“有借必有贷,借贷必相等”的记账原则,出现了记错账的情况,使数据处于不一致性(或不符合业务规则、不被用户认可)的状态。这个简单的例子只使用了两个UPDATE语句,然而更实际的事务通常都包含多个INSERT, UPDATE, DELETESELECT...FOR UPDATE语句。


 


Oracle提供的事务控制语句包括:


  • 提交事务(COMMIT)。

  • 回退事务(ROLLBACK)。

  • 设置保存点(SAVEPOINT)。

  • 回退部分事务/回退到保存点(ROLLBACK TO SAVEPOINT)。

  • 设置事务的属性(SETTRANSACTION)。

  • 设置可延迟约束的检验时机(SETCONSTRANTS)。


    设置保存点(SAVEPOINT)和回退到保存点(ROLLBACKTO SAVEPOINT)目前在RDBMS业内还没有得到十分广泛的应用。


正如前面所述,事务是用来分隔数据库操作的逻辑单位的,因此事务是有起点和终点的。


   Oracle的一个重要特点就是没有“开始事务处理”的语句。用户不能也不必显式地开始一个事务处理。当发生如下事件之一时,事务就开始了。


  • 连接到数据库,并开始执行第一条DML语句。

  • 前一个事务结束或者执行一条会自动提交事务的语句。


当发生如下事件之一时,事务就结束了。


  • 执行一条COMMIT语句或ROLLBACK语句。

  • 执行一条会自动提交事务的语句。

  • 执行一条DML语句却失败了(此时会因为这个失败的DML语句而自动回退事务)。回退部分事务( ROLLBACK TO SAVEPOINT)不会终止一个事务,也不会开始下一个事务。


当发生以下情况时会自动提交事务。


  • 执行一条DDL语句(如createtablealter tabledrop tableaker system)。

  • 执行一条DCL语句(如grantrevokeauditnoauditrename)。

  • 断开与数据库的连接。如在SQL*Plus中执行一条disconnect命令,或在同一个SQL*Plus中执行另一条connect命令启动一个会话(即可同时断开前一个会话),或执行exit命令退出SQL*Plus。如果SQL*Plus被意外中止(如计算机断电、崩溃等),就会自动执行rollback语句。此情况适用于任何能访问数据库的应用程序,如自己编写的应用程序。


另外,在SQL*Plus中还可以设置自动提交功能,即使用SET autocommit ON I OFF俞令来设置是否进行自动提交。也就是说,一旦设置了自动提交,用户每次执行insertupdatedelete命令成功后,系统就会自动进行提交。但这种方法不利于实现多条语句组成的逻辑单位,所以默认是不自动提交的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值