2016年NIIT认证面试题精选

什么是事务?四大事务特性是什么?(ACID)

2016年NIIT认证面试题精选

事务是单个的工作单元。如果某一事务成功,则在该事务中进行的所有数据修改均会提交,成为数据库中的永久组成部分。如果事务遇到错误且必须取消或回滚,则所有数据修改均被清除。

举个例子,比如你去银行转帐就是一个事务。转帐可以简单的分为两个步骤,一是把钱从你的帐户中扣除,二是把钱存到你指定转帐的帐户中。这两个步骤就是一个事务,必须全部执行,或是全部不执行。如果从你帐户扣钱成功,但是转帐失败,那么你转帐的钱就没有了;如果是扣钱失败了,但是转帐成功了,那银行就亏了。

事务是作为单个逻辑工作单元执行的一系列操作。一个逻辑工作单元必须有四个属性,称为原子性、一致性、隔离性和持久性 (ACID) 属性,只有这样才能成为一个事务。

原子性:事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。

一致性:事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的'。

隔离:由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务识别数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是第二个事务修改它之后的状态,事务不会识别中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。

持久性:事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。

SQL Server 以下列事务模式运行。

自动提交事务:每条单独的语句都是一个事务。

显式事务:每个事务均以 BEGIN TRANSACTION 语句显式开始,以 COMMIT 或 ROLLBACK 语句显式结束。

隐式事务:在前一个事务完成时新事务隐式启动,但每个事务仍以 COMMIT 或 ROLLBACK 语句显式完成。

批处理级事务:只能应用于多个活动结果集 (MARS),在 MARS 会话中启动的 Transact-SQL 显式或隐式事务变为批处理级事务。当批处理完成时没有提交或回滚的批处理级事务自动由 SQL Server 进行回滚。

Sql Server中有三种使用事务的方法,分别是Sql语句,SqlTransaction和TransactionScope,下面一节将分别介绍这三种事务的使用方法。htt

事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列操作

q 这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行

q 事务是一个不可分割的工作逻辑单元

转帐过程就是一个事务。

它需要两条UPDATE语句来完成,这两条语句是一个整体,如果其中任一条出现错误,则整个转帐业务也应取消,两个帐户中的余额应恢复到原来的数据,从而确保转帐前和转帐后的余额不变,即都是1001元。

  事务的特性

事务必须具备以下四个属性,简称ACID属性:

•q原子性(Atomicity):事务是一个完整的操作。事务的各步操作是不可分的(原子的);要么都执行,要么都不执行

•q一致性(Consistency):当事务完成时,数据必须处于一致状态

•q隔离性(Isolation):对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务

•q永久性(Durability):事务完成后,它对数据库的修改被永久保持,事务日志能够保持事务的永久性

  如何创建事务

q T-SQL使用下列语句来管理事务:

q 开始事务:BEGIN TRANSACTION

q 提交事务:COMMIT TRANSACTION

q 回滚(撤销)事务:ROLLBACK TRANSACTION

一旦事务提交或回滚,则事务结束。

q 判断某条语句执行是否出错:

q 使用全局变量@@ERROR;

q @@ERROR只能判断当前一条T-SQL语句执行是否有错,为了判断事务中所有T-SQL语句是否有错,我们需要对错误进行累计;

如: SET @errorSum=@errorSum+@@error

  了解事务的分类:

q 显示事务:用BEGIN TRANSACTION明确指定事务的开始,这是最常用的事务类型

q 隐性事务:通过设置SET IMPLICIT_TRANSACTIONS ON 语句,将隐性事务模式设置为打开,下一个语句自动启动一个新事务。当该事务完成时,再下一个 T-SQL 语句又将启动一个新事务

q 自动提交事务:这是 SQL Server 的默认模式,它将每条单独的 T-SQL 语句视为一个事务,如果成功执行,则自动提交;如果错误,则自动回滚

q 使用事务解决银行转帐问题

……关键语句讲解………

BEGIN TRANSACTION

/*--定义变量,用于累计事务执行过程中的错误--*/

DECLARE @errorSum INT

SET @errorSum=0 --初始化为0,即无错误

/*--转帐:张三的帐户少1000元,李四的帐户多1000元*/

UPDATE bank SET currentMoney=currentMoney-1000

WHERE customerName='张三'

SET @errorSum=@errorSum+@@error

UPDATE bank SET currentMoney=currentMoney+1000

WHERE customerName='李四'

SET @errorSum=@errorSum+@@error --累计是否有错误

IF @errorSum<>0 --如果有错误

BEGIN

print '交易失败,回滚事务'

ROLLBACK TRANSACTION

END

ELSE

BEGIN

print '交易成功,提交事务,写入硬盘,永久的保存'

COMMIT TRANSACTION

END

Go

print '查看转帐事务后的余额'

SELECT * FROM bank

GO