读和删是否应该位于一个事务中

作者:vkvi 来源:ITPOW(原创) 日期:2007-4-17

取这个题目有一定的局限性,因为它只适用于本文限定的条件下。

条件

首先,读一条记录,如果读取成功,则删除该记录。继续读下一条记录……

事务

事务是作为单个逻辑工作单元执行的一系列操作。白话:一个事务中可能做多件事情,如果其中一件事情发生了错误,则其它事情也撤销或取消。

分析

应用于本文中就是,读取记录成功,删除记录失败,是否应该撤销读取成功?

我个人认为应该,因为我本人就遇到了此种情况。

记录读取出来分析并插入到另一库中,可是在删除记录时失败了,于是程序再读取时又是读取的刚才那条记录,如此反复,直到程序成功删除了该记录。

方案:如果读数据成功,且删数据成功,执行处理数据。

这个方案也是有风险的,如果处理数据失败怎么办?数据已经删除了。

改进方案:读数据->处理数据->删除数据,三个步骤当作一个事务。

这似乎没有问题了,真的吗?我们处理数据这一步的结果,难道不会在被撤销之前被其它程序使用吗?比如:处理数据就是将数据插入到另一个库中,如果删除数据失败,就会撤销插入,可是在插入之后撤销之前,可能会被另一个程序所读取。

进一步改良:读数据->预处理数据->删除数据->处理数据,四个步骤当作一个事务。

预处理相当于测试一下处理是否会成功,由于有了测试,处理数据最终的成功率得到了一定保障,但仍然不是绝对的。

回归本质:读数据->处理数据->删除数据,三个步骤当作一个事务,在事务未完成之前,将处理数据所得的结果进行保护,其它程序不得读取。

这种方法比较可靠,缺点就是对处理数据进行保护上较为复杂,除了要修改处理数据的程序外,还可能需要修改应用这些处理结果的程序。其实:这里才算得上是真正的事务,前面所说的事务不具有隔离性。


SQL Server 中的事务

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

原子性

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

一致性

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

隔离性

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

持久性

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

相关文章