【发布时间】:2009-07-28 18:27:02
【问题描述】:
在 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;这种情况不需要担心并发更新,因为数据库会处理一致性问题,但存在 creds 很容易变成负数的缺陷,这对于某些应用程序可能没有意义。
那么简单,处理上述(非常简单)问题的公认方法是什么,如果 db 抛出错误怎么办?
【问题讨论】:
-
如果您担心违反列约束,请在数据库中定义 CONSTRAINTS。
标签: sql concurrency