请高手们讲讲数据库中事务的使用吧!!!!

2024-12-29 14:36:17
推荐回答(3个)
回答1:

事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性:
· 原子性
事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。通常,与某个事务关联的操作具有共同的目标,并且是相互依赖的。如果系统只执行这些操作的一个子集,则可能会破坏事务的总体目标。原子性消除了系统处理操作子集的可能性。
· 一致性
事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。某些维护一致性的责任由应用程序开发人员承担,他们必须确保应用程序已强制所有已知的完整性约束。例如,当开发用于转帐的应用程序时,应避免在转帐过程中任意移动小数点。
· 隔离性
由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。当事务可序列化时将获得最高的隔离级别。在此级别上,从一组可并行执行的事务获得的结果与通过连续运行每个事务所获得的结果相同。由于高度隔离会限制可并行执行的事务数,所以一些应用程序降低隔离级别以换取更大的吞吐量。
· 持久性
事务完成之后,它对于系统的影响是永久性的。该修改即使出现致命的系统故障也将一直保持。
那么该处理结果是不明确的。
不加控制的并发存取会产生以下几种错误:
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语句处。

回答2:

oracle的数据语音分为数据定义语言(DDL)、数据控制语言(DCL)和数据操纵语言(DML)。其中的DML语言会生成事务,其他两种语言只要执行,事务就会结束。

简单的说DML语言可以建立事务,DDL和DCL不能建立事务。

DML语言包括几个命令,例如 select insert delete update等等,这些命令执行后,当前用户的显示信息是更改了,但是其他人访问你改的表的时候数据并没有更改,需要使用commit确认后才能更改。如果当前用户在没有执行commit前反悔操作了,那使用rollback命令可以回退到执行操纵语句之前,但是如果已经执行了commit语句是无法回退的。

例如你delete了一行数据,你确定就使用commit命令,后悔想回去就使用rollba命令。

无论你使用确认还是回退都可以结束这个事务,别人就可以查看你更改后的表了。
因为事务开始后,如果不结束,是不会更改表中数据的,他把更改的结果存储在内存的缓存区中,所以如果回滚的时候断电,实际上会恢复到事务开始之前的数据。

回答3:

不知道你想问的是什么数据库,我只知道oracle的事务机制,就和你说说oracle吧(要是有错误请其他达人纠正)。
oracle是通过insert,update,delete,for uptate来开启事务的。当程序执行这四种语句的其中任何一句时就开启事务。当在之后执行commit(提交)或者rollback(回滚)时就会结束事务。
其实回滚很好理解,好比你去自助银行去存款,你把钱放进存款机之后,进行一些存款操作,但这期间出错了(银行的机器真是烂),那存款机还是会把钱吐出来的。在DB中也是一样的,在一系列的事务操作中,如果其中一步出错了,那之前的数据也是不能插入数据库的,就要恢复到事务操作之前的状态,就是回滚呗。你说的断电的为题吗,说实话没遇到过,我知道oracle对于这种问题的解决办法(但我从没实践过)。这里首先还要说个词就是回滚段,回滚段用于存储你修改前的值。当用户回滚时,oracle将会利用回滚段中的数据前影像来将修改的数据恢复到原来的值。而当事务正在处理的时候,例程失败,回滚段的信息保存在重做日志文件中,oracle将在下次打开数据库时利用回滚来恢复未提交的数据(没试过)。说到底还是要经常备份数据,比啥都强啊。