MySQL事务 - 在队列中处理的拍卖出价INSERT?

时间:2012-01-13 22:42:37

标签: php mysql transactions

我目前正在开发一个拍卖网站作为投资组合项目的一部分,我遇到了一个似乎无法解决的有趣问题。

目前我正在检查当前的最高出价(查询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查询的方法,以确保不会发生这种情况?

2 个答案:

答案 0 :(得分:2)

一种可能的方法是使用select for update,如果禁用自动提交,则锁定所选行。此时,如果出价较高,则插入新的出价并提交交易,如果出价较低,您可以通知用户并回滚(或提交)交易

答案 1 :(得分:1)

就个人而言,我会有第二张表存储所有出价并定期更新主要出价。 这样,主要出价只会从单一来源更新,而且您永远不会有双重写入问题。

例如,在表格mainBid中设置了主要出价金额。 人们的出价将存储在tempBid中,每隔X秒就会检出tempBid的最高出价以更新mainBid