【问题标题】:MySQL transactions - Auction bid INSERTs processed in a queue?MySQL 事务 - 在队列中处理的拍卖出价插入?
【发布时间】:2012-01-13 22:42:36
【问题描述】:

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

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

【问题讨论】:

    标签: php mysql transactions


    【解决方案1】:

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

    【讨论】:

    • 可能,目前我正在存储拍卖的每个出价,但我真的不需要保留这些。锁定行绝对是解决问题的一种方法!
    【解决方案2】:

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

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

    【讨论】:

    • 是的,使用两个表似乎是个好主意。你会使用 cron 来更新表吗?
    猜你喜欢
    • 2021-03-18
    • 2022-11-17
    • 1970-01-01
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多