首页  编辑  

事务处理介绍

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 语句处。