打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Oracle与SQLServer事务处理的比较

事务处理是所有大型数据库产品的一个关键问题,各数据库厂商都在这个方面花费了很大精力,不同的事务处理方式会导致数据库性能和功能上的巨大差异。
事务处理也是数据库管理员与数据库应用程序开发人员必须深刻理解的一个问题,对这个问题的疏忽可能会导致应用程序逻辑错误以及效率低下。
     下面我们针对Oracle及SQL Server这两种当前广泛使用的大型数据库产品,探讨一下它们在事务处理方面的一些差异。如没有特殊说明,本文内容适用的数据库产品版本为 Oracle9i及SQL Server 2000,其中的示例SQL语句,对于Oracle是在SQL*Plus中执行,而对于SQL Server 2000是在osql中执行。

1. 事务的概念
     事务可以看作是由对数据库的若干操作组成的一个单元,这些操作要么都完成,要么都取消,从而保证数据满足一致性的要求。事务的一个典型例子是银行中的转帐操作,帐户A把一定数量的款项转到帐户B上,这个操作包括两个步骤,一个是从帐户A上把存款减去一定数量,二是在帐户B上把存款加上相同的数量。这两个步骤显然要么都完成,要么都取消,否则银行就会受损失。显然,这个转帐操作中的两个步骤就构成一个事务。
    
数据库中的事务还有如下ACID特征。
     ACID分别是四个英文单词的首写字母,这四个英文单词是Atomicity、Consistency、Isolation、Durability,分别翻译为原子性、一致性、隔离性、持久性。
    原子性:指事务中的操作,或者都完成,或者都取消。
    一致性:指事务中的操作保证数据库中的数据不会出现逻辑上不一致的情况,一致性一般会隐含的包括在其他属性之中。
    隔离性:指当前的事务与其他未完成的事务是隔离的。在不同的隔离级别下,事务的读取操作,可以得到的结果是不同的。
    持久性:指对事务发出COMMIT命令后,即使这时发生系统故障,事务的效果也被持久化了。与此相反的是,当在事务执行过程中,系统发生故障,则事务的操作都被回滚,即数据库回到事务开始之前的状态。
    对数据库中的数据修改都是在内存中完成的,这些修改的结果可能已经写到硬盘也可能没有写到硬盘,如果在操作过程中,发生断电或系统错误等故障,数据库可以保证未结束的事务对数据库的数据修改结果即使已经写入磁盘,在下次数据库启动后也会被全部撤销;而对于结束的事务,即使其修改的结果还未写入磁盘,在数据库下次启动后会通过事务日志中的记录进行“重做”,即把丢失的数据修改结果重新生成,并写入磁盘,从而保证结束事务对数据修改的永久化。这样也保证了事务中的操作要么全部完成,要么全部撤销。

2. 事务设置及类型的区别
    在SQL Server中有三种事务类型,分别是:隐式事务、显式事务、自动提交事务,缺省为自动提交。
    自动提交 ,是指对于用户发出的每条SQL语句,SQL Server都会自动开始一个事务,并且在执行后自动进行提交操作来完成这个事务,也可以说在这种事务模式下,一个SQL语句就是一个事务。
    显式事务 ,是指在自动提交模式下以Begin Transaction开始一个事务,以Commit或Rollback结束一个事务,以Commit结束事务是把事务中的修改永久化,即使这时发生断电这样的故障。例如下面是SQL Server中的一个显式事务的例子。
Begin Tran
Update emp Set ename=’Smith’ Where empno=7369
Insert Into dept Values(60,’HR’,’GZh’)
Commit
    隐式事务 ,是指在当前会话中用Set Implicit_Transactions On命令设置的事务类型,这时任何DML语句(Delete、Update、Insert)都会开始一个事务,而事务的结束也是用Commit或Rollback。
    在Oracle中没有SQL Server的这些事务类型,缺省情况下任何一个DML语句都会开始一个事务,直到用户发出Commit或Rollback操作,这个事务才会结束,这与SQL Server的隐式事务模式相似。

3. 事务隔离级别
    在SQL92标准中,事务隔离级别分为四种,分别为:Read Uncommitted、Read Committed、Read Repeatable、Serializable,其中Read Uncommitted与Read Committed为语句级别的,而Read Repeatable与Serializable是针对事务级别的。
    在Oracle和SQL Server中设置事务隔离级别的语句是相同的,都使用SQL92标准语法,即:
Set Transaction Isolation Level Read Committed
    上面示例中的Read Committed可以被替换为其他三种隔离级别中的任意一种。

1) SQL Server中的隔离级别及实现机制
    在SQL Server中提供了所有这四种隔离级别。
    下面我们讨论在SQL Server中,这几种隔离级别的含义及其实现方式。
    Read Uncommitted :一个会话可以读取其他事务未提交的更新结果,如果这个事务最后以回滚结束,这时的读取结果就可能是错误的,所以多数的数据库应用都不会使用这种隔离级别。
    Read Committed :这是SQL Server的缺省隔离级别,设置为这种隔离级别的事务只能读取其他事务已经提交的更新结果,否则,发生等待 ,但是其他会话可以修改这个事务中被读取的记录,而不必等待事务结束 ,显然,在这种隔离级别下,一个事务中的两个相同的读取操作,其结果可能不同。
    Read Repeatable :在一个事务中,如果在两次相同条件的读取操作之间没有添加记录的操作,也没有其他更新操作导致在这个查询条件下记录数增多,则两次读取结果相同。换句话说,就是在一个事务中第一次读取的记录保证不会在这个事务期间发生改变。SQL Server是通过在整个事务期间给读取的记录加锁实现这种隔离级别的 ,这样,在这个事务结束前,其他会话不能修改事务中读取的记录,而只能等待事务结束,但是SQL Server不会阻碍其他会话向表中添加记录,也不阻碍其他会话修改其他记录。
    Serializable :在一个事务中,读取操作的结果是在这个事务开始之前其他事务就已经提交的记录,SQL Server通过在整个事务期间给表加锁实现这种隔离级别 。在这种隔离级别下,对这个表的所有DML操作都是不允许的,即要等待事务结束,这样就保证了在一个事务中的两次读取操作的结果肯定是相同的。
2) Oracle中的隔离级别及实现机制
    在Oracle中,没有Read Uncommitted及Repeatable Read隔离级别,这样在Oracle中不允许一个会话读取其他事务未提交的数据修改结果,从而避免了由于事务回滚发生的读取错误。Oracle中的 Read Committed和Serializable级别,其含义与SQL Server类似,但是实现方式却大不一样。
    在Oracle中,存在所谓的回滚段 (Oracle9i之前版本)或撤销段(Oracle9i版本),Oracle在修改数据记录时,会把这些记录被修改之前的结果存入回滚段或撤销段中,就是因为这种机制,Oracle对于事务隔离级别的实现与SQL Server截然不同。在Oracle中,读取操作不会阻碍更新操作,更新操作也不会阻碍读取操作,这样在Oracle中的各种隔离级别下,读取操作都不会等待更新事务结束,更新操作也不会因为另一个事务中的读取操作而发生等待,这也是Oracle事务处理的一个优势所在。
    Oracle缺省的设置是Read Committed隔离级别 (也称为语句级别的隔离),在这种隔离级别下,如果一个事务正在对某个表进行DML操作,而这时另外一个会话对这个表的记录进行读取操作,则Oracle会去读取回滚段或撤销段中存放的更新之前的记录,而不会象SQL Server一样等待更新事务的结束。
    在Serializable隔离级别(也称为事务级别的隔离),事务中的读取操作只能读取这个事务开始之前已经提交的数据结果。如果在读取时,其他事务正在对记录进行修改,则Oracle就会在回滚段或撤销段中去寻找对应的原来未经更改的记录 (而且是在读取操作所在的事务开始之前存放于回滚段或撤销段的记录),这时读取操作也不会因为相应记录被更新而等待。

4. DDL语句对事务的影响
1) Oracle中DDL语句对事务的影响
    在Oracle中,执行DDL语句(如Create Table、Create View等)时,会在执行之前自动发出一个Commit命令,并在随后发出一个Commit或者Rollback命令,也就是说,DDL会象如下伪码一样执行:
Commit;
DDL_Statement;
If (Error) then
Rollback;
Else
Commit;
End if;

我们通过分析下面例子来看Oracle中,DDL语句对事务的影响:
Insert into some_table values(‘Before’);
Creaate table T(x int);
Insert into some_table values(‘After’);
Rollback;
    由于在Oracle执行Create table语句之前进行了提交,而在Create table执行后也会自动发出Commit命令,所以只有插入After的行被回滚,而插入Before的行不会被回滚,Create table命令的结果也不会被回滚,即使Create table语句失败,所进行的Before插入也会被提交。如果最后发出Commit命令,因为插入Before及Create table的操作结果已经在之前提交,所以Commit命令影响的只有插入After的操作。

2) SQL Server中DDL语句对事务的影响
在SQL Server中,DDL语句对事务的影响与其他DML语句相同,也就是说,在DML语句发出之前或之后,都不会自动发出Commit命令。
在SQL Server 2000中,对于与上面Oracle同样的例子,最后发出Rollback后,数据库会回滚到插入Before之前的状态,即插入Before和After的行都会被回滚,数据表T也不会被创建。
如果最后发出Commit操作,则会把三个操作的结果全部提交。


5. 用户断开数据库连接对事务的影响
    另外,对应于Oracle的管理客户端工具SQL*Plus,在SQL Server 2000中是osql,两种管理工具都是命令行工具,使用方式及作用也类似,但是在SQL*Plus中,用户退出连接时,会自动先发出Commit命令,然后再退出,而在osql中,如果用户退出连接,会自动发出Rollback命令,这对于SQL Server的自动提交模式没有什么影响,但如果处于隐式事务模式,其影响是显而易见的。对于两种数据库产品的其他客户端管理工具也有类似的不同之处。  



http://www.cnblogs.com/buggavin/articles/870118.html/

//////////////////////////////

 

sql server编程结构(五)--事务(trancation)

什么是事务:事务是用户对数据库进行的一系列的操作的集合,所以事务就是一系列的操作.
事务的特点:位于事务里面的操作要么都做,要么都不做.
事务的运行模式:sql server以三种模式来确定一个事务
A:自动提交事务:每条单独的一个sql语句就是一个事务[证明]
B:显示事务:必须以[begin tran]语句显式开始,以[commit tran]或[rollback tran]语句显示结束.
C:隐性事务:在前一个事务完成时新事务隐式启动,但每个事务仍以[COMMIT]或[ROLLBACK]语句显示完成.
[SET IMPLICIT_TRANSACTIONS ON] 必须打开
[当设置为ON时,SET IMPLICIT_TRANSACTIONS将连接设置为隐性事务模式.当设置为OFF时,则使连接返回到自动提交事务模式]
比如:SET IMPLICIT_TRANSACTIONSON
begin tran
update work set 基本工资=基本工资+100
commit tran
delete work
rollback tran [等一下再讲解]

显示事务:1:begin tran [开始一个事务]
2:commit tran[结束一个事务]
3:rollback tran[回滚一个事务]
4:save tran 名字 [设置保存点]
比如:begin tran
update work set 基本工资=基本工资+100
查看一下:select * from work
如果这个时候后悔了,可执行rollback tran来进行回滚事务(取消).如果确认了就执行commit tran确认前滚事务(执行事务)
试着执行以下语句:insert work(职工号) values(\'034\')
然后执行:commit tran或rollback tran看一下系统会提示什么
说明:A:只有运用了begin tran的事务,才可以用运用rollback tran或commit tran来回滚或前滚事务[隐性事务除外]
B:如果一个事务已经运用了commit tran则不能再运用rollback tran.
C:可以在一些操作中设置一些保存点:只取消保存点之后的操作.
比如:begin tran
update work set 基本工资=基本工资+100 where 性别=\'男\'
save tran ss[设置保存点]
delete work
如果后悔了,可以执行:1:[rollback tran ss]则从[save tran ss]开始,下面的语句将取消
2:如果执行[rollback tran]将取消整个事务

1:rollback tran 保存点 [从下到上,一直到保存点之间的语句被取消]
2:先[rollback tran 保存点名],再[rollback tran],结果:整个事务取消.相当于从一开始就[rollback tran]整个事务.
3:如果先执行[rollback tran保存点名],再执行[commit tran],结果:是从保存点到[begin tran]之间的语句被提交.
4:可以设置多个保存点.
5:前滚保存点就是前滚整个事务.

conn.BeginTrans

On Error GoTo err:

conn.CommitTrans

err:
    conn.RollbackTrans

 

////////////////////////////////////////////

////////////////////////////////////////////

////////////////////////////////////////////

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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
数据库中事务机制的进阶使用(整理)
三大常用数据库事务详解之三:事务运行模式
Oracle事务
Oracle与SQL Server事务处理的比较 - 51CTO.COM
oracle分布式事务总结
Oracle PL/SQL开发基础(第十三弹:提交和回滚记录)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服