【发布时间】:2011-05-03 13:46:39
【问题描述】:
我读到 Oracle 维护行版本来处理并发性。我想在一个非常大的实时数据库上运行更新查询,但是这个更新作业必须更改该行的最新版本。
这可以通过 PL/SQL 还是简单的 SQL 实现?
在下面编辑**
让我澄清一下场景,即我们在一个非常大的数据库上面临的现实问题。我们的客户是一家知名的手机服务商。
我们的数据库有一个表格,用于管理客户手机帐户上的当前余额记录。在表格的其他列中,一列存储已完成的充值量,另一列管理当前剩余的活动余额。
我们有两个独立的 PL/SQL 脚本。当客户为手机充电并更新余额时,会自动触发一个脚本。
第二个脚本是关于从客户帐户中扣除某些费用。这是一个批处理作业,因为它适用于所有客户。此脚本计划在一天的特定时间间隔运行。运行此脚本时,它会在内存中加载 50,000 条记录,更新某些列并执行批量更新回表。
发生的问题是这样的:
一位 ID 为 101 的客户联系了当地商店为手机充电。他支付金额。但是直到他的手机快要充电的时候,第二个脚本的预定时间才触发了第二个脚本。第二个脚本在内存中加载了 50,000 个客户的记录。在这个内存记录中,也是这个客户的记录之一。
直到第二个脚本批量更新完成,第一个脚本成功为客户账户充值。
现在发生的是实际表,列:“CurrentAccountBalance”更新为 150,但第二个脚本正在处理的内存中记录具有客户的旧余额,即 100。
第二个脚本必须从列中减去 10:“CurrentAccountBalance”。当根据实际工作,客户的“CurrentAccountBalance”应该是140时,这个问题使他的余额为90。
现在如何处理这个问题。
【问题讨论】:
-
你说的是闪回,Oracle 的临时访问?
-
没有。纯 SQL 更新语句。
-
您正在尝试查看来自另一个会话的未提交数据?然后在提交之前更新它!?
-
更新将始终针对该行的最后提交版本。我不确定你的问题是什么。如果您希望修改大量数据,您是否尝试包含在更新开始后修改和提交的行?
-
我不寒而栗地想到如果有什么事情会如何运作但是这甚至是可能的......
标签: oracle oracle10g oracle11g oracle9i