事务处理是所有大型数据库产品的一个关键问题,各数据库厂商都在这个方面花费了很大精力,不同的事务处理方式会导致数据库性能和功能上的巨大差异。
事务处理也是数据库管理员与数据库应用程序开发人员必须深刻理解的一个问题,对这个问题的疏忽可能会导致应用程序逻辑错误以及效率低下。
下面我们针对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
发表评论
-
数据库常识
2011-07-05 14:56 0delete from aa truncate table ... -
Oracle存储过程实例
2010-01-28 22:47 9230create or replace proc ... -
JDBC事务
2010-01-28 22:28 0作者:Jack Shirazi 开发 ... -
Sqlldr简介
2009-10-21 14:10 1287罗列了网上常见的三篇Sqlldr的介绍 一:sql lo ... -
Oracle中实现行列转换的方法
2009-07-21 22:31 1246student subject grade -------- ... -
oracle 中日期的加减
2009-07-21 22:00 21527加法 select sysdate,add_mo ... -
Oracle 分页
2009-03-26 17:07 0select * from (select rownum ... -
MYSQL的乱码问题
2009-02-17 12:45 835总结了一下几个处理方法 1:改变数据库的默认编码配置,在MYS ... -
几种开源数据库连接池的使用 --转载
2009-01-17 13:36 1789转载: http://www.blogjava.net/fa ... -
Resin和Tomcat的JNDI数据连接池配置
2009-01-17 13:35 4186先说Resin的JNDI数据池连 ... -
tomcat5.0与tomcat5.5的数据库连接池jndi配置区别
2009-01-17 13:35 1746在tomcat5.5版本以前,可以说jndi配置相对是比较复杂 ... -
tomcat5.0连接池配置成功了,池连,JNDI
2009-01-17 13:34 0http://heisetoufa.iteye.com/blo ... -
java连接oracle数据库的各种方法及java在数据库中的含义
2009-01-17 13:34 1240java与oracle的接口: 在数据库中运行JA ... -
开源数据库连接池proxool
2009-01-17 13:32 1739关键词:proxool 连接池 开源 可以根据自己的实际情况, ... -
java实现 excel 中数据导入 oracle
2009-01-17 13:31 2950ORACLE是有一个叫ADI的解决方案 所需的额外包:comm ... -
registerOutParameter Method (SQLServerCallableStat
2009-01-17 13:31 1094registerOutParameter Method (SQ ... -
JDBCTM 指南CallableStatement
2009-01-17 13:31 10807 - CallableStatement 本概述 ... -
OJB查询
2009-01-17 13:27 1547该文档介绍了不同查询 ... -
OJB MySQL 配置
2009-01-17 13:26 11261. repository-database.xml < ... -
深入解析什么是存储过程
2009-01-17 13:26 2243深入解析什么是存储过 ...
相关推荐
本文旨在比较Oracle和SQL Server在事务处理方面的不同实现机制。 首先,事务的概念需要明确。在数据库管理中,事务是指一系列的操作,这些操作要么全部执行,要么全部不执行。事务的一个核心特性是ACID属性,即原子...
通过对 Oracle 和 SQL Server 的深度对比,我们可以看出两者在操作系统的支持、版本和发行版、实例和数据库管理、事务一致性与基于时间点的恢复、系统元数据、启动与配置参数、动态视图、存储结构、启动与关闭、...
Oracle和SQL Server是两大主流的关系型数据库管理系统,广泛应用于企业级的数据存储和处理。这两个数据库系统各有其特性和优势,但为了在Java环境下与它们进行交互,我们需要对应的数据库驱动包。这里提到的"oracle,...
Oracle、SQL Server 及 MySQL 对比 Oracle、SQL Server 及 MySQL 是目前最流行的三大关系数据库管理系统,各有其优缺点。本文将从表空间、查询语句、事务、分区表和分区索引、优缺点等方面对三者进行比较。 表空间...
"SQL Server 连接 Oracle 方法" SQL Server 连接 Oracle 方法是数据库管理系统中的一个重要话题。本文将详细介绍如何在 SQL Server 中连接 Oracle 数据库,并解决在连接过程中可能出现的问题。 安装 Oracle 客户端...
【深度对比Oracle与SQL Server】 在信息技术领域,数据库管理系统(DBMS)的选择对企业的信息架构至关重要。Oracle和Microsoft SQL Server是两大主流的关系型数据库管理系统(RDBMS),各自有着广泛的应用。本文...
String url = "jdbc:sqlserver://<服务器地址>:<端口>;databaseName=<数据库名>"; String user = "<用户名>"; String password = "<密码>"; try { Class.forName(...
通过比较上述知识点,我们可以看出Oracle和SQL Server在事务处理上都有相似的目标和方法,旨在保证数据的一致性和可靠性。然而,它们在实现细节和特定功能上存在差异,使得数据库管理员和开发人员需要根据具体的应用...
标题“Oracle、DB2、SQL Server”提示我们讨论的是三个主要的关系型数据库管理系统(RDBMS):Oracle、IBM DB2以及Microsoft SQL Server。这些数据库系统在IT领域中广泛用于数据存储、管理和处理,尤其在企业级应用...
本话题聚焦于使用Java来实现在Oracle和SQL Server之间的大规模数据迁移。Oracle是知名的高性能关系型数据库,而SQL Server则是Microsoft公司推出的强大数据库解决方案,两者在语法、数据类型以及管理方式上都有所...
- 两者都支持`BEGIN TRANSACTION`、`COMMIT`和`ROLLBACK`,但Oracle还提供了`SAVEPOINT`,SQL Server有`SET XACT_ABORT`来控制事务错误处理。 6. **游标**: - Oracle使用`CURSOR`关键字定义,SQL Server则通过`...
【SQL Server和Oracle并行处理比较分析】 在数据库系统中,数据一致性是核心问题之一,尤其是在高并发的环境中。SQL Server和Oracle作为两大主流的关系型数据库管理系统,它们各自采用了独特的并行处理策略来应对这...
【标签】:“ORACLE,sql server笔试题目,答案”进一步强调了文件内容的核心,即与Oracle和SQL Server相关的考试题目和解题策略。这些题目可能包括但不限于数据库概念、SQL语法、数据库设计、性能优化、安全性、备份...
Oracle 和 SQL Server 的主要区别 Oracle 和 SQL Server 是两种流行的关系数据库管理系统,它们之间存在一些关键的区别。在本文中,我们将探讨 Oracle 和 SQL Server 之间的主要区别,以帮助您做出正确的选择。 ...
【SQL Server与Oracle开发比较】 在数据库开发领域,SQL Server和Oracle是两个广泛使用的数据库管理系统。它们虽然在很多方面有着相似之处,但也存在着显著的区别,尤其是在语法和功能上。以下是对两者之间主要差异...
Oracle的NCLOB用于存储Unicode数据,与SQL Server的NCHAR和NTEXT相呼应,但Oracle的NCLOB在事务处理方面更具优势。RAW数据类型则用于存储固定长度的二进制数据,而SQL Server的VARBINARY则用于存储变长二进制数据。 ...
【Java SSH Oracle SQLServer 学习笔记】 Java是一种广泛使用的面向对象的编程语言,它以其跨平台、开源和丰富的库而闻名。SSH是三个开源框架的缩写,分别是Spring、Struts和Hibernate,它们在Java Web开发中起着至...
Oracle 和 Microsoft SQL ...例如,Oracle在大型企业级应用和复杂事务处理中表现出色,而SQL Server在Windows环境下和与Microsoft产品集成时可能更为简便。在进行数据库设计时,理解这些差异可以帮助做出更明智的决策。
尽管 SQL Server 的事务隔离级别更多,但实际操作中仍可能遇到事务阻塞,而 Oracle 利用回退段更好地实现了事务隔离,降低了阻塞的可能性。 7. 外键约束: SQL Server 的外键约束支持级联删除和级联更新,而 Oracle...