事务和锁(二)

<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
四、 事务

事务是指一个单元的工作,这些工作要么全做,要么全部不做。作为一个逻辑单元,必须具备四个属性:自动性、一致性、独立性和持久性。

自动性是指 事务必须是一个自动的单元工作,要么执行全部数据的修改,要么全部数据的修改都不执行。

一致性是指当 事务完成时,必须使所有数据都具有一致的状态。在关系型数据库中,所有的规则必须应用到 事务的修改上,以便维护所有数据的完整性。所有的内部数据结构,例如树状的索引与数据之间的链接,在 事务结束之后,必须保证正确。

独立性是指并行 事务的修改必须与其他并行 事务的修改相互独立。一个 事务看到的数据要么是另外一个 事务修改这些 事务之前的状态,要么是第二个 事务已经修改完成的数据,但是这个 事务不能看到正在修改的数据。这种特征也称为串行性。持久性是指当一个 事务完成之后,它的影响永久性的产生在系统中,也就是这种修改写到了数据库中。

事务机制保证一组数据的修改要么全部执行,要么全部不执行。使用 事务保证数据的一致性和确保在系统失败时的可恢复性。 事务是一个可以恢复的单元的工作,由一条或者多条Transact-SQL语句组成,可以影响到表中的一行或者多行数据。 事务打开以后,直到 事务成功完成提交为止,或者到 事务执行失败全部取消或者滚回去为止。

事务的工作原理图

事务确保数据的一致性和可恢复性。 事务的工作原理如图1所示。




图1 事务的工作原理图


事务开始之后, 事务所有的操作都陆续写到 事务日志中。写到日志中的操作,一般有两种:一种是针对数据的操作,一种是针对任务的操作。针对数据的操作,例如插入、删除和修改,这是典型的 事务操作,这些操作的对象是大量的数据。有些操作是针对任务的,例如创建索引,这些任务操作在 事务日志中记录一个标志,用于表示执行了这种操作。当取消这种 事务时,系统自动执行这种操作的反操作,保证系统的一致性。系统自动生成一个检查点机制,这个检查点周期地发生。检查点的周期是系统根据用户定义的时间间隔和系统活动的频度由系统自动计算出来的时间间隔。检查点周期地检查 事务日志,如果在 事务日志中, 事务全部完成,那么检查点将 事务日志中的 事务提交到数据库中,并且在 事务日志中做一个检查点提交标记。如果在 事务日志中, 事务没有完成,那么检查点将 事务日志中的 事务不提交到数据库中,并且在 事务日志中做一个检查点未提交标记。 事务的恢复以及检查点保护系统的完整和可恢复,可以使用如图2所示的示例说明。




图2 事务恢复和检查点示例


在这个示例图中,有五个 事务事务1、 事务2、 事务3、 事务4和 事务5。方框表示 事务的开始和完成提交。水平方向表示时间。检查点表示在某一时间点发生检查点机制,系统失败表示在某一时间点由于断电、系统失败等原因而发生的系统失败。 事务1的完成发生在检查点发生之间,所以 事务1被提交到数据库中。 事务2和 事务4的完成发生在系统失败之前,所以这两个 事务可以被系统向前滚动提交到数据库中。 事务3和 事务5由于系统失败而没有完成,所以这两个 事务被取消。

五、使用 事务的考虑

在使用 事务时,原则上应该使 事务尽可能短并且要避免 事务嵌套。 事务应该尽可能短,这是因为比较长的 事务增加了 事务占用数据的时间,延长了其它必须等待访问该 事务锁定数据的 事务等待访问数据的时间。在使用 事务时,为了使 事务尽可能短,应该采取一些相应的方法。为了最小化时间,在使用一些Transact-SQL语句时,一定要非常小心。例如,当使用循环语句WHILE时,一定要事先确认循环的长度和占用的时间,使这种循环在完成相应的功能之前,一定要确保循环尽可能短。在开始 事务之前,一定要了解需要用户交互式操作才能得到的信息。这样,在 事务的进行过程中,就可以避免进行一些耗费时间的交互式操作,缩短 事务进程的时间。在一个用户定义的 事务中,应该尽可能地使用一些数据操纵语言,例如INSERT、UPDATE和DELETE语句,因为这些语句主要是操纵数据库中的数据。而对于一些数据定义语言,应该尽可能少用或者不用,因为这些数据定义语言的操作既占用比较长的时间,又占用比较多的资源,并且这些数据定义语言的操作通常不涉及数据,所以应该在 事务中尽可能少用或者不用这些操作。另外,在使用数据操纵语言时,要注意,一定要在这些语句中使用条件判断语句,使得这些数据操纵语言涉及到尽可能少的记录,从而缩短 事务的处理时间。上一页 
<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值