事物的原子性(Atomic)、一致性(Consistent)、独立性(Isolated)及持久性(Durable)。
1.事务的原子性是指一个事务要么全部执行,要么不执行.也就是说一个事务不可能只执行了一半就停止了.比如你从取款机取钱,这个事务可以分成两个步骤:1划卡,2出钱.不可能划了卡,而钱却没出来.这两步必须同时完成.要么就不完成.
2.事务的一致性是指事务的运行并不改变数据库中数据的一致性.例如,完整性约束了a+b=10,一个事务改变了a,那么b也应该随之改变.
3.事务的独立性是指两个以上的事务不会出现交错执行的状态.因为这样可能会导致数据不一致.
4.事务的持久性是指事务运行成功以后,就系统的更新是永久的.不会无缘无故的回滚.
事务处理:
假设你想用ATM自动取款机把你储蓄存款帐户上的一笔钱转帐到你的经常帐户上去,在钱已经从存款帐户上出来正在转到经常帐户的时候,电脑突然崩溃!你的钱去哪了?不要担心,事务处理程序会使它非常安全。
仔细想想银行在幕后要做些什么工作,你一定想当然地认为银行在进行存款、提款、转帐等工作的中间什么也没干。公司、银行甚至国家每天要电子转帐几百万美圆,如果这笔资金不保险的话,那世界金融市场将会整个崩溃。
让我举一个简单的例子来说明事务处理程序的重要性。在第一国家银行中,客户可以在任何时间存款,他们也可以从他们的帐户上提款,只要所提款额小于或等于帐户中的金额。所以,拥有多个帐户的客户可以将钱款在帐户之间来回转帐。
FoxPro应用程序使用帐户类管理银行中的帐户。这个类中包含两种方式: Deposit() 和 Withdraw()。如果系统失败,这两种方式中的一种有可能会另更新数据库操作失败,比如在取款和存款结束之前电源断掉,或者帐户中没有足够的钱时,取款失败。
系统设计者要对资金在帐户见的转帐进行严格的测试。这需要往一个帐户上存款,而同时从另一个帐户取款。注意这里是同时。提款和存款不能顺序发生;他们必须同时发生,这笔转帐资金不在这个帐户或者不在那个帐户,这都是不能接受的。要么存款和提款同时成功,要么同时失败。我们该怎样做呢?
ACID测试
一笔事务其实就是数据库中收到保护的一组更新数据。所有在事务处理开始和事务结束期间的数据库改变都是受到保护的。理想情况下,事务处理程序应当能通过原子的、一致的、独立的、耐久的ACID(Atomic、 Consistent、 Isolated、 Durable)测试。理想情况下,一笔事务应当能经受住这种ACID测试。
在化学上,原子是拥有所有元素特性的最小的不可分割的单位。同样,一个原子级的事务也是最小的不可分割的单位。在转帐的例子中,一个完整的事务处理需要改变两个帐户,只改变一个帐户是不合理的。
一致性:意味着事务处理正确地转换了系统状态。要么是资金离开一个帐户进入另一个帐户,要么是都保持不变---只有这两种可能的状态。如果系统没有得到转换后状态,就回到没有转换时的状态而不会停在中间。
独立性:保证任何其他的事务都不能看到一个处在不完整状态下的事务处理。尽管实际上在钱款被提走而还没有存入另一个帐号期间有一个远远小于一秒的间隔,系统中的其他事务也不会知道的。
耐久性:表示事务处理能在系统失败时保存完好。一个事务处理应当能够承受所有的失败,包括服务器、进程、通信以及媒体失败等等。
FoxPro开发人员怎样做才能为应用程序提供事务处理的可靠保护呢?而且,应当怎样才能以高效、快捷的方式实现呢?怎样将事务处理的保护集成到多种应用程序的体系结构中呢?在这篇文章中,我们来看看如何在一个健壮、可升级和面向对象的应用程序中进行事务处理,这其中包括本地的和远程的数据。我们还会介绍一些事务处理的新技术。