"VALUES ($customer_id,$item_id,$quantity)");
if (!$res || pg_cmdtuples($res) < 1) {
$feedback .= pg_errormessage($conn);
$feedback .= ' Error-couldn't insert into cart ';
//尽管没有东西被改变,但是最好还是回滚事务
query("ROLLBACK");
return false;
} else {
query("COMMIT");
return true;
}
} else {
//购物车中已经存在该物品
$res=query("UPDATE cart_items SET quantity = quantity + $quantity ".
"WHERE part_number='$item_id' AND
customer_id='$customer_id'");
if (!$res || pg_cmdtuples($res) < 1) {
$feedback .= pg_errormessage($conn);
$feedback .= ' Error-couldn't increment quantity in cart ';
query("ROLLBACK");
return false;
} else {
// 提交改变,正式更新数据库。
query("COMMIT");
return true;
}
}
}
}
?>
现在我们能建立新顾客,并且他们添加物品了。我们现在需要结账,并减掉库存。这一部分是最复杂的,充分利用了Postgres 的事务功能和先进锁机制。
我们用Postgres 的 SELECT...FOR UPDATE 语法作为开始,这个语句能有效地对当前选择的行加锁使你能在一个事务里更新并提交改变。
通过在一个事务里使用这个语句,你可以保证数据的一致性。在其他的一些数据库,例如MySQL ,就不能锁定指定的数据行,而得到不正确的数据以及没用的库存统计。
这个语句也能利用子查询,另外一个数据库的标准特性。子查询可以让你很省事地把两个查询结合在一起,
锁定行以后,我们需要按照购物车的物品减少对应的库存量。为简便起见,我们对库存不够不报告错误,并把库存变为负数。你可以自己写一个管理页面,查看负数库存的物品,并去订购。
最后,我们更新顾客表中的信用卡,购买信息,合计购买金额,撤掉这个顾客的session。
表五、结账,减库存
<?
| 对此文章发表了评论 |
