我目前正在开发一个拍卖网站作为投资组合项目的一部分,我遇到了一个有趣的问题,似乎无法解决。
目前,我正在检查当前的最高出价(查询1),然后如果出价高于当前存储的出价,则将新的出价插入数据库(查询2)。相当基本的逻辑,显然,如果出价较低,那么最终将通知用户。
Query 1:
$result = mysql_query("SELECT * FROM bids WHERE item_id = '".$_POST['id']."' ORDER BY bids.amount DESC LIMIT 1");
Query 2:
$query = sprintf("INSERT INTO bids(item_id,buyer_id,amount,created) VALUES('%s','%s','%s',NOW())",
mysql_real_escape_string($item_id),
mysql_real_escape_string($user_id),
mysql_real_escape_string($amount));注意:我知道这段代码存在主要的安全问题,但这只是一个例子……
然而,我不确定是否会有这样一种情况,在检查价格和插入数据库之间,另一个查询实际上可以更快地进行,插入到数据库中,然后破坏当前的竞价逻辑。
使用带有mysqli或PDO驱动程序的事务足以确保出价正确排队吗?
MySQL是否提供了一种对mysql查询进行排队的方法来确保这种情况不会发生?
发布于 2012-01-14 07:01:57
一种可能的方法是使用select for update,如果禁用自动提交,则锁定选定的行。此时,如果出价较高,则插入新的出价并提交事务;如果出价较低,则可以通知用户并回滚(或提交)事务
发布于 2012-01-14 10:05:55
就我个人而言,我会有一个第二个表,存储所有的出价,并定期更新主要出价。这样,主bid将只从单一来源更新,并且您永远不会有双重写入问题。
因此,例如,在表mainBid中设置了主要投标金额。人们的出价将存储在tempBid中,每X秒一次,您将从tempBid检索最高出价以更新mainBid
https://stackoverflow.com/questions/8858248
复制相似问题