Есть 3 таблицы.
1) Пользователь, имеющий деньги.
users: id(int), cash(int(>=0))
пример 10, 1000
Пользователь 10 имеет 1000 рублей. Используем пространственное ограничение cash>0
2) Магазин имеющий товары:
shop: id(int), count
пример: 5, 20
В магазине товаров под номером 5 - 20 штук
3) Покупки пользователя
items: uid(int), item(int), count(int)
пример 10, 5, 3
У пользователя номер 10, 3 штуки товара номер 5.
Задача реализовать покупку товара. Важно 2 вещи:
1) надежно
2) быстро
Варианты:
1)
SET XACT_ABORT ON;
BEGIN TRANSACTION;
UPDATE users SET cash=cash-@price WHERE id=@uid;
UPDATE items SET count=count+1 WHERE uid=@uid and item=@item;
IF @@ROWCOUNT=0
INSERT INTO items VALUES (@uid, @item, 1);
UPDATE shop SET count=count-1 WHERE item=@item;
COMMIT TRANSACTION;
Здесь основано на ограничениях.
2)
BEGIN TRANSACTION;
UPDATE users SET cash=cash-@price WHERE id=@uid and cash>=@price;
IF @@ROWCOUNT=0
ROLLBACK TRANSACTION;
UPDATE items SET count=count+1 WHERE uid=@uid and item=@item;
IF @@ROWCOUNT=0
INSERT INTO items VALUES (@uid, @item, 1);
UPDATE shop SET count=count-1 WHERE item=@item;
COMMIT TRANSACTION;
Здесь заложена проверка в UPDATE.
3) Другие варианты?
Хочется услышать аргументированный ответ.