脏读问题,如何在sql server 2005中解决

时间:2010-11-06 15:07:38

标签: sql sql-server-2005

如何在sql server中解决以下脏读问题。

有一位顾客 发票报告,在下午1:00运行,之后所有发票都发送到 各个客户的付款。让我们说一个客户有1000美元需要支付。顾客 在凌晨1:00支付1000美元,同时运行报告。实际上,客户没有钱 等待但仍然发出发票。

如何解决这个问题,对于不可重复的读取

例如,客户想要预订航班,所以旅行 代理商检查航班可用性。旅行社找到座位并继续预订座位。 当旅行社预订座位时,其他一些旅行社会预订座位。当这个 旅行社去更新记录,他得到错误说“座位已经预订”。简而言之, 旅行社在不同时间为海洋获得不同的地位

此问题也困扰我.....失去更新

假设客户已到期 要支付2000美元。他支付1000美元并再次购买500美元的产品。让我们说这两个 交易现在是从公司的两个不同柜台输入的。现在两个 计数器用户在上午10:00开始进入。实际上是在上午10:01说的 客户应该有2000美元-1000美元+ 500 = 1500美元等待支付。但正如失去的更新说的那样 不考虑第一个事务,第二个事务覆盖它。所以最后待决 是2000 $ + 500 $ = 2500 $ .....我希望公司不会让客户失望。

1 个答案:

答案 0 :(得分:3)

您正在描述逻辑分离。

在后一种情况下,您需要逐项列明发票,并说明客户是否支付了某些没有的东西;通过系统让它知道它将通过。

首先,错误只是说明显而易见的。它与磁盘访问和文件句柄的情况相同。仅仅因为你在检查时写入文件并不意味着你可以在尝试时实际写入文件。

你必须处理错误。

在第一种情况下,我不明白为什么你不能说这个数额待定的时间。如果发送空发票确实是个问题,那么您需要在发出之前立即检查。如果发票上确实没有任何项目,那么就会有一些逻辑表明此发票上的挂起没有明细项目或者总数为零。但如果是因为发票和收据之间已经支付了,那么你仍然有一张有效的发票。

如果您正在讨论一次更新记录的两件事情,那么您需要使用锁定系统以确保在进行另一次写入时没有其他进程写入。

有各种各样的并发方法 - 例如semephore系统。 sql本身有事务。谷歌SQL并发,这是许多解决方案的常见问题。

常见模式是读取,锁定,读取,写入和解锁。

Understanding Concurrency Control

要考虑的是你想要读取或写入的高性能吗?您使用的策略将反映这一点。例如,您正在考虑单个字段......但是在单行上更新多个字段呢?