GBase 8s SQL 指南:教程 / 对多用户环境编程 |
EXEC SQL DECLARE sto_curse CURSOR FOR SELECT * FROM stock WHERE manu_code = 'ANZ';
EXEC SQL UPDATE stock SET unit_price = 1.15 * unit_price WHERE manu_code = 'ANZ';
您的程序仅向您显示更新了的行。
您的程序仅向您显示原始的行。
您的程序可能返回的既有原始的行,也有更新了的行。
您的程序可向您显示的既有原始的行,也有在数据库中不再存在的更新了的行。
前两种可能性是无害的。在第 1 种可能的情况中,在您的查询开始之前完成了更新。更新是在一毫秒之前结束的,还是一周前结束的,并无差异。
在第 2 种可能的情况中,实际上,您的查询在更新开始之前完成。其他程序可能紧跟在您的程序之后只处理了一行,或它可能直到明晚才开始;这没有关系。
然而,后两种可能的情况对于某些应用程序的设计可至关重要。在第 3 种可能的情况下,查询返回的既有更新了的数据,也有原始数据。在某些应用程序中,那种结果可能是有害的。在其他程序中,诸如计算所有价格的平均值,根本无关紧要。
由于取消了它们的事务,如果程序返回一些在表中不可再找到的数据行,则第 4 种可能的情况是灾难性的。
要控制诸如此类的事件,请使用数据库服务器的锁定和隔离级别特性。