活动集和并发

当仅一个程序正在使用数据库时,活动集的成员不可更改。大多数个人计算机都是这种情况,且是要考虑的最简单情况。但必须为了在多编程系统中使用来设计一些程序,在此,两个、三个或几十个不同的程序可同时在相同的表上工作。

在您的游标是打开的时,当其他程序可更新表时,活动集的思路用处不大了。您的程序在某一时刻仅看到一行数据,但表中的所有其他行可能正在更改。

在简单查询的情况下,当数据库服务器仅持有活动集的一行时,任何其他行都可更改。在您的程序访存行之后的那一刻,另一程序可删除同一行或更新它,于是,如果在此检查它,它不再是活动集的一部分。

当在临时表中保存活动集或它的一部分时,旧数据可出现问题。即,从其派生活动集行的实际的表中的行可更改。如果真是这样,某些活动集行不再反映当前的表内容。

最初这些想法令人不安,但只要您的程序仅读取数据,就不存在旧数据,更确切地说,所有数据都同样陈旧。活动集是数据在某一时刻的快照。第二天行就不一样了;如果它在下一毫秒也不一样,倒无所谓。换言之,在程序正在运行时发生的更改,与该程序终止的那一刻保存和应用的更改之间,没有实际的差异。

旧数据可导致问题的唯一时刻,是当程序打算使用输入的数据来修改同一数据库时;例如,当银行业应用程序必须读取账户余额、更改它并将它写回时。通过 SQL 程序修改数据 讨论修改数据的程序。