数据库事物

数据库事务是指作为单个逻辑工作单元执行的一系列操作,这些操作要么全做要么全不做,是一个不可分割的工作单位。

数据库事务的四大特性(简称ACID)是: 

(1) 原子性(Atomicity)

事务的原子性指的是,事务中包含的程序作为数据库的逻辑工作单位,它所做的对数据修改操作要么全部执行,要么完全不执行。这种特性称为原子性。

例如银行取款事务分为2个步骤(1)存折减款(2)提取现金。不可能存折减款,却没有提取现金。2个步骤必须同时完成或者都不完成。

(2)一致性(Consistency)    

事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。这种特性称为事务的一致性。假如数据库的状态满足所有的完整性约束,就说该数据库是一致的。

例如完整性约束a+b=10,一个事务改变了a,那么b也应随之改变。

(3)分离性(亦称独立性Isolation)

分离性指并发的事务是相互隔离的。即一个事务内部的操作及正在操作的数据必须封锁起来,不被其它企图进行修改的事务看到。假如并发交叉执行的事务没有任何控制,操纵相同的共享对象的多个并发事务的执行可能引起异常情况。

(4)持久性(Durability)

持久性意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失。即一旦一个事务提交,DBMS保证它对数据库中数据的改变应该是永久性的,即对已提交事务的更新能恢复。持久性通过数据库备份和恢复来保证


一 事务处理介绍  

事务是这样一种机制,它确保多个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语句处。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值