lt; 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;
}
}
}
}
$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 ,就不能锁定指定的数据行,而得到不正确的数据以及没用的库存统计。
| 对此文章发表了评论 |
