首页  编辑  

事务处理介绍

Tags: /超级猛料/Database.数据库相关/   Date Created:

一 事务处理介绍

    事务是这样一种机制,它确保多个 SQL 语句被当作单个工作单

元来处理。事务具有以下的作用:

   * 一致性:同时进行的查询和更新彼此不会发生冲突,其他

用户不会看到发生了变化但尚未提交的数据。

   * 可恢复性:一旦系统故障,数据库会自动地完全恢复未完

成的事务。

二 事务与一致性

    事务是完整性的单位,一个事务的执行是把数据库从一个一

致的状态转换成另一个一致的状态。因此,如果事务孤立执行时

是正确的,但如果多个事务并发交错地执行,就可能相互干扰,

造成数据库状态的不一致。在多用户环境中,数据库必须避免同

时进行的查询和更新发生冲突。这一点是很重要的,如果正在被

处理的数据能够在该处理正在运行时被另一用户的修改所改变,

那么该处理结果是不明确的。

    不加控制的并发存取会产生以下几种错误:

   1 丢失修改( lost updates )

    当多个事务并发修改一个数据时,不加控制会得出错误的结

果,一个修改会覆盖掉另一个修改。

   2 读的不可重复性

    当多个事务按某种时间顺序存取若干数据时,如果对并发存

取不加控制,也会产生错误。

   3 脏读( DIRDY DATA ),读的不一致性

   4 光标带来的当前值的混乱

    事务在执行过程中它在某个表上的当前查找位置是由光标表

示的。光标指向当前正处理的记录。当处理完该条记录后,则指

向下一条记录。在多个事务并发执行时,某一事务的修改可能产

生负作用,使与这些光标有关的事务出错。

   5 未释放修改造成连锁退出

    一个事务在进行修改操作的过程中可能会发生故障,这时需

要将已做的修改回退( Rollback )。如果在已进行过或已发现错

误尚未复原之前允许其它事务读已做过修改(脏读),则会导致

连锁退出。

   6 一事务在对一表更新时,另外的事务却修改或删除此表的

定义。

    数据库会为每个事务自动地设置适当级别的锁定。对于前面

讲述的问题:脏读、未释放修改造成的连锁退出、一事务在对一

表更新时另外的事务却修改或删除此表的定义,数据库都会自动

解决。而另外的三个问题则需要在编程过程中人为地定义事务或

加锁来解决。

三 事务和恢复

    数据库本身肩负着管理事务的责任。事务是最小的逻辑工作

单元,在这个工作单元中,对数据库的所有更新工作,要么必须

全部成功,要么必须全部失败(回退)。只要应用程序指定了某

段程序为一个事务并做了相应的处理(提交或回退),数据库系

统会自动维护事务本身的特性。

四 ORACLE 数据库的事务定义

   ORACLE 事务从 COMMIT 、 ROLLBACK 、连接到数据库或开始第一

条可执行的 SQL 语句时开始,到一条 COMMIT 、 ROLLBACK 语句或退出

数据库时结束。如果在一个事务中包含 DDL 语句,则在 DDL 语句的

前后都会隐含地执行 COMMIT 语句,从而开始或结束一个事务。

    如果一个事务由于某些故障或者由于用户改变主意而必须在

提交前取消它,则数据库被恢复到这些语句和过程执行之前的状

态。

    利用 ROLLBACK 语句可以在 COMMIT 命令前随时撤消或回退一个

事务。可以回退整个事务,也可以会退部分事务,但是不能回退

一个已经被提交的事务。回退部分事务的 ROLLBACK 命令为:

   ROLLBACK to savepoint 存储点名

    存储点是用户放入事务中的标记,用来表示一个可被回退的

位置。存储点通过在事务中放入一个 SAVEPOINT 命令而被插入。该

命令的语法是:

   SAVEPOINT 存储点名

    如果在 ROLLBACK 语句中没有给出存储点名,则整个事务被回

退。

五 SYBASE 数据库的事务定义

   SYBASE 通过使用 BEGIN TRANsaction 和 COMMIT TRANsaction 命令指

示 SQL 将任意数目的语句作为一个单元来处理。 ROLLBACK TRANsaction

命令则允许用户恢复到事务的开始,或恢复到事务内部已经被用 SAVE

TRANsaction 命令定义的存储点上。

   BEGIN TRANsaction 和 COMMIT TRANsaction 能够包含任意数目的 SQL

语句和存储过程,方法很简单:

   BEGIN TRANsaction [ 事务名称 ]

   COMMIT TRANsaction

    如果一个事务由于某些故障或者由于用户改变主意而必须在提交

前取消它,则数据库被恢复到这些语句和过程执行之前的状态。

    利用 ROLLBACK TRANsaction 命令可以在 COMMIT TRANsaction 命令

前随时回退一个事务。可以回退整个事务,也可以回退部分事务,但

是不能回退一个已经被提交的事务。 ROLLBACK TRANsaction 命令为:

   ROLLBACK TRANsaction [ 事务名 | 存储点名 ]

    存储点名是用户放入事务中的标记,用来表示一个可以被回退的

位置。存储点名通过在事务中放入一个 SAVE TRANsaction 命令而被插

入。该命令的句法是:

   SAVE TRANsaction 存储点名

    如果在 ROLLBACK TRANsaction 中没有给出存储点名或事务名,则

事务被回退到批处理中的第一个 BEGIN TRANsaction 语句处。