具有 sql 性能或准确性问题的网络交易

web transactions having sql performance or accuracy issue

故事是这样的:

当同一个账户有2次并发提现$10,且账户总额只有$10时

结果:均提现成功,账户余额为-$10。

如果我进行如下查询:

UPDATE table
SET amount = amount - 10
WHERE (amount-10 > 0) AND id = 123;

安全准确,只提一次成功

是否会出现性能问题,因为金额无法编入索引?

将查询写为:

 UPDATE table
    SET amount = amount - 10
    WHERE amount > 10;

然后就可以使用索引了。我确实认为您应该将 update 限制为仅给定帐户:

 UPDATE table
    SET amount = amount - 10
    WHERE account = @account AND amount > 10;

那么 account 上的索引总是可以使用的。