在SQL数据库中处理并发更新的常用方法是什么?
考虑一个简单的SQL模式(未显示约束和默认值。),例如
create table credits (
int id,
int creds,
int user_id
);
目的是为用户存储某种信用。类似stackoverflow的声誉。
如何处理对该表的并发更新?
一些选择:
update credits set creds= 150 where userid = 1;
在这种情况下,应用程序检索当前值,计算新值(150)并执行更新。如果其他人在同一时间做同样的事,那将带来灾难。
我猜想包装当前值的回归并在交易中更新将解决这个问题,例如
Begin; select creds from credits where userid=1; do application logic to calculate new value, update credits set credits = 160 where userid = 1; end;
在这种情况下,您可以检查新信用是否小于0,如果负信用没有意义,则将其截断为0。 update credits set creds = creds - 150 where userid=1;
这种情况无需担心并发更新,因为DB会处理一致性问题,但存在的缺点是信誉很可能变成负面,这对于某些应用程序可能没有意义。
简而言之,处理上述(非常简单)问题的可接受方法是什么,如果数据库抛出错误怎么办?
最佳答案
使用交易:
BEGIN WORK;
SELECT creds FROM credits WHERE userid = 1;
-- do your work
UPDATE credits SET creds = 150 WHERE userid = 1;
COMMIT;
一些重要的注意事项:
将事务与SQL存储过程结合在一起可以使后者更易于处理;应用程序将仅在事务中调用一个存储过程,并在事务中止时重新调用它。
关于sql - 如何处理数据库中的并发更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1195858/