数据库原理与运用之事务控制与并发处理Word文档格式.docx
- 文档编号:15870591
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:13
- 大小:23.77KB
数据库原理与运用之事务控制与并发处理Word文档格式.docx
《数据库原理与运用之事务控制与并发处理Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据库原理与运用之事务控制与并发处理Word文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性。
●原子性(Atomicity):
事务是数据库操作的逻辑工作单位。
就操作而言,事务中的操作是一个整体,不能再被分割,要么全部成功执行,要么全部不成功执行。
●一致性(Consistency):
事务一致性是指事务执行前后都能够保持数据库状态的一致性,即事务的执行结果是将数据库从一个一致性状态变到另一个一致性状态。
●隔离性(Isolation):
隔离性是指多个事务在执行时不互相干扰。
事务具有隔离性意味着一个事务的内部操作即其使用的数据库对其他事务是不透明的,其他事务不会干扰这些操作和数据。
●持续性(Durability):
指事务一旦提交,则其对数据库中数据的改变就应该是永久的,即使是出现系统故障等问题。
事务开始之后,事务所有的操作都陆续写到事务日志中。
这些任务操作在事务日志中记录一个标志,用于表示执行了这种操作,当取消这种事务时,系统自动执行这种操作的反操作,保证系统的一致性。
系统自动生成一个检查点机制,这个检查点周期地发生。
检查点的周期是系统根据用户定义的时间间隔和系统活动的频度由系统自动计算出来的时间间隔。
检查点周期地检查事务日志,如果在事务日志中,事务全部完成,那么检查点将事务提交到数据库中,并且在事务日志中做一个检查点提交标记。
如果在事务日志中,事务没有完成,那么检查点将事务日志中的事务不提交到数据库中,并且在事务日志中做一个检查点未提交标记。
13.1.3事务和批的差别
编程时,一定要区分事务和批的差别:
1.批是一组整体编译的SQL语句,事务是一组作为单个逻辑工作单元执行的SQL语句。
2.批语句的组合发生在编译时刻,事务中语句的组合发生在执行时刻。
3.当在编译时,批中某个语句存在语法错误,系统将取消整个批中所有语句执行,而在运行时刻,如果事务中某个数据修改违反约束、规则等,系统默认只回退到产生该错误的语句。
4.如果批中产生一个运行时错误,系统默认只回退到产生该错误的语句。
但当打开XACT_ABORT选项为ON时,可以系统自动回滚产生该错误的当前事务。
一个事务中也可以拥有多个批,一个批里可以有多个SQL语句组成的事务,事务内批的多少不影响事务的提交或回滚操作。
13.1.4事务的类型
根据事务的设置、用途的不同,SQLServer2005将事务分为多种类型。
1.根据系统的设置分类
根据系统的设置,SQLServer2005将事务分为两种类型:
系统提供的事务和用户定义的事务,分别简称为系统事务和用户定义事务。
(1)系统事务
系统提供的事务是指在执行某些语句时,一条语句就是一个事务。
但是要明确,一条语句的对象既可能是表中的一行数据,也可能是表中的多行数据,甚至是表中的全部数据。
因此,只有一条语句构成的事务也可能包含了多行数据的处理。
系统提供的事务语句如下:
ALTERTABLE、CREATE、DELETE、DROP、FETCH、GRANT、INSERT、OPEN、REBOKE、SELECT、UPDATE、TRUNCATETABLE
这些语句本身就构成了一个事务。
【例1】使用CREATETABLE创建一个表。
CREATETABLEstudent
(idCHAR(10),
nameCHAR(6),
sexCHAR
(2)
)
说明:
这条语句本身就构成了一个事务。
这条语句由于没有使用条件限制,那么这条语句就是创建包含3个列的表。
要么创建全部成功,要么全部失败。
(2)用户定义事务
在实际应用中,大多数的事务处理采用了用户定义的事务来处理。
在开发应用程序时,可以使用BEGINTRANSACTION语句来定义明确的用户定义的事务。
在使用用户定义的事务时,一定要注意事务必须有明确的结束语句来结束。
如果不使用明确的结束语句来结束,那么系统可能把从事务开始到用户关闭连接之间的全部操作都作为一个事务来对待。
事务的明确结束可以使用两个语句中的一个:
COMMIT语句和ROLLBACK语句。
COMMIT语句是提交语句,将全部完成的语句明确地提交到数据库中。
ROLLBACK语句是取消语句,该语句将事务的操作全部取消,即表示事务操作失败。
还有一种特殊的用户定义的事务,这就是分布式事务。
例12-1事务是在一个服务器上的操作,其保证的数据完整性和一致性是指一个服务器上的完整性和一致性。
但是,如果一个比较复杂的环境,可能有多台服务器,那么要保证在多台服务器环境中事务的完整性和一致性,就必须定义一个分布式事务。
在这个分布式事务中,所有的操作都可以涉及对多个服务器的操作,当这些操作都成功时,那么所有这些操作都提交到相应服务器的数据库中,如果这些操作中有一个操作失败,那么这个分布式事务中的全部操作都将被取消。
2.根据运行模式分类
根据运行模式,SQLServer2005将事务分为4种类型:
自动提交事务、显示事务、隐式事务和批处理级事务。
(1)自动提交事务
自动提交事务是指每条单独的语句都是一个事务。
(2)显式事务
显式事务指每个事务均以BEGINTRANSACTION语句显式开始,以COMMIT或ROLLBACK语句显示结束。
(3)隐式事务
隐式事务指在前一个事务完成时新事务隐式启动,但每个事务仍以COMMIT或ROLLBACK语句显式完成。
(4)批处理级事务
该事务只能应用于多个活动结果集(MARS),在MARS会话中启动的T-SQL显式或隐式事务变为批处理级事务。
当批处理完成时,没有提交或回滚的批处理级事务自动由SQLServer语句集合分组后形成单个的逻辑工作单元。
13.2事物的控制
事务是一个数据库操作序列,由若干个语句组成。
那么如何利用自己已有的语句组成一个事务呢?
这就涉及到事务的启动和终止问题。
13.2.1启动事务
在SQLServer中,启动事务的方式有三种:
显示启动、自动提交和隐式启动。
1.显示启动
显示启动是以BEGINTRANSACTION命令开始的,即当执行该语句时,SQLServer将认为这是一个事务的起点。
BEGINTRANSATION的语法如下:
BEGIN{TRAN|TRANSACTION}
[{TRANSACTION_NAME|@TRAN_NAME_VARIABLE}
[WITHMARK[‘description’]]
]
[;
]
RANSACTION_NAME|@TRAN_NAME_VARIABLE:
指定事务的名称,可以用变量提供名称。
该项是可选项。
[WITHMARK[‘description’]]:
指定在日志中标记事务。
Description是描述该标记的字符串。
如果使用了WITHREMARK,则必须指定事务名。
WITHREMARK允许将事务日志还原到命名标记。
2.自动提交
自动提交是指用户每发出一条SQL语句,SQLSERVER会自动启动一条事务,语句执行完了以后,SQLSERVER自动执行提交操作来提交该事务。
3.隐式启动
当将IMPLICIT_TRANSACTIONS设置为ON时,表示将隐式事务模式设置为打开,设置语句如下:
SETIMPLICIT_TRANSACTIONSON;
在隐式事务模式下,任何DML语句(Delete、Update、INSERT)都自动启动一个事务。
隐式启动的事务通常称为隐性事务。
13.2.2终止事务
终止方法有两种,一种是使用COMMIT命令(提交命令),另一种是使用ROLLBACK命令(回滚命令)。
但这俩种方法有本质上的区别;
当执行COMMIT命令是,会将语句执行结果保存到数据库中,并终止事务;
当执行ROLLBACK命令时,数据库将返回到事务开始时的初始状态,并终止事务。
1.COMMITTRANSACTION提交事务
执行COMMITTRANSACTION语句时,将终止隐式启动或显示启动的事务。
如果@@TRANCOUNT为1,COMMITTRANSACTION使得自从事务开始以来所有数据修改成为数据库的永久部分,释放事务所占用的资源,并将@TRANCOUNT为0。
如果大于1,则COMMITTRANSACTION使@@TRANCOUNT按1递减并且事务将保持活动状态。
COMMIT{TRAN|TRANSCATION}[transaction_name|@tran_name_variable]][;
【例2】实现银行帐号转帐功能的事务。
BEGINTRANSCATIONvirement
DECLARE@balancefloat,@xfloat;
--显示启动事务
SET@x=200;
--当转出金额小于x时,取消操作
SELECT(@balance=balanceFROMUserTableWHEREacount=‘20000000xxxxxxx1’;
If(@balance<
@x)return;
UPDATEUserTableSETbalance=balance-@xwhereaccount=‘20000000xxxxxxx1’;
UPDATEUserTableSETbalance=balance+@xwhereaccount=‘20000000xxxxxxx2’;
GO
COMMITTRANSACTIONvirement;
--提交事务,事务终止
如果在一个事务中,既有成功执行的DML,也有因为内部错误而导致失败执行的DML语句,该事务会回滚吗?
一般,SQL-Server只回滚产生错误的语句,而不会回滚整个事务。
如果希望遇到错误时,事务能够自动回滚整个事务,则SETXACT_ABORT选项设置为ON。
SETXACT_ABORTON;
2.回滚事务-ROLLBACKTRANSACTION
它可以将显示事务或隐式事务回滚到事务的起点或事务内部的某个保存点。
ROLLBACK{TRAN|TRANSACTION}
[transaction_name|@tran_name_variable|savepoint_name][;
根据是否有保存点可以将回滚分为全部回滚或部分回滚。
设置保存点:
用于在事务中设置一个保存点,目的是在撤消事务时可以只撤消部分事务,以提高系统的效率
SAVETRANSACTIONsave1;
两个可用于事务管理的全局变量是@@error及@@rowcount。
●@@error:
给出最近一次执行的出错语句引发的错误号,@@error为0表示未出错。
●@@rowcount:
给出受事务中已执行语句所影响的数据行数。
事务控制语句的使用
事务控制语句的使用方法如下:
BEGINTRAN
/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库 原理 运用 事务 控制 并发 处理