具有 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
上的索引总是可以使用的。
故事是这样的:
当同一个账户有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
上的索引总是可以使用的。