快捷搜索:

Oracle与SQL Server事务处理的比较

事务处置惩罚是所有大年夜型数据库产品的一个关键问题,各数据库厂商都在这个方面花费了很大年夜精力,不合的事务处置惩罚要领会导致数据库机能和功能上的伟大年夜差异。

事务处置惩罚也是数据库治理员与数据库利用法度榜样开拓职员必须深刻理解的一个问题,对这个问题的纰漏可能会导致利用法度榜样逻辑差错以及效率低下。

下面我们针对Oracle及SQL Server这两种当前广泛应用的大年夜型数据库产品,探究一下它们在事务处置惩罚方面的一些差异。如没有特殊阐明,本文内容适用的数据库产品版本为Oracle9i及SQL Server 2000,此中的示例SQL语句,对付Oracle是在SQL*Plus中履行,而对付SQL Server 2000是在osql中履行。

一.事务的观点

事务可以看作是由对数据库的多少操作组成的一个单元,这些操作要么都完成,要么都取消,从而包管数据满意同等性的要求。事务的一个典典范子是银行中的转帐操作,帐户A把必然数量的款项转到帐户B上,这个操作包括两个步骤,一个是从帐户A上把存款减去必然数量,二是在帐户B上把存款加上相同的数量。这两个步骤显然要么都完成,要么都取消,否则银行就会受丧掉。显然,这个转帐操作中的两个步骤就构成一个事务。

数据库中的事务还有如下ACID特性。

ACID分手是四个英文单词的首写字母,这四个英文单词是Atomicity、Consistency、Isolation、Durability,分手翻译为原子性、同等性、隔离性、持久性。

原子性:指事务中的操作,或者都完成,或者都取消。

同等性:指事务中的操作包管数据库中的数据不会呈现逻辑上不同等的环境,同等性一样平常会隐含的包括在其他属性之中。

隔离性:指当前的事务与其他未完成的事务是隔离的。在不合的隔离级别下,事务的读取操作,可以获得的结果是不合的。

持久性:指对事务发出COMMIT敕令后,纵然这时发生系统故障,事务的效果也被持久化了。与此相反的是,当在事务履行历程中,系统发生故障,则事务的操作都被回滚,即数据库回到事务开始之前的状态。

对数据库中的数据改动都是在内存中完成的,这些改动的结果可能已经写到硬盘也可能没有写到硬盘,假如在操作历程中,发生断电或系统差错等故障,数据库可以包管未停止的事务对数据库的数据改动结果纵然已经写入磁盘,鄙人次数据库启动后也会被整个撤销;而对付停止的事务,纵然其改动的结果还未写入磁盘,在数据库下次启动后会经由过程事务日志中的记录进行“重做”,即把损掉的数据改动结果从新天生,并写入磁盘,从而包管停止事务对数据改动的永远化。这样也包管了事务中的操作要么整个完成,要么整个撤销。

二.事务设置及类型的差别

在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的隐式事务模式相似。

三.事务隔离级别

在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就会在回滚段或撤销段中去探求对应的原本未经变动的记录(而且是在读取操作所在的事务开始之前寄放于回滚段或撤销段的记录),这时读取操作也不会由于响应记录被更新而等待。

四.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操作,则会把三个操作的结果整个提交。

五.用户断开数据库连接对事务的影响

别的,对应于Oracle的治理客户端对象SQL*Plus,在SQL Server 2000中是osql,两种治理对象都是敕令行对象,应用要领及感化也类似,然则在SQL*Plus中,用户退出连接时,会自动先发出Commit敕令,然后再退出,而在osql中,假如用户退出连接,会自动发出Rollback敕令,这对付SQL Server的自动提交模式没有什么影响,但假如处于隐式事务模式,其影响是显而易见的。对付两种数据库产品的其他客户端治理对象也有类似的不合之处。

您可能还会对下面的文章感兴趣: