Php 如何同步同一表中的单元格值?

Php 如何同步同一表中的单元格值?,php,mysql,database-deadlocks,optimistic-concurrency,database-concurrency,Php,Mysql,Database Deadlocks,Optimistic Concurrency,Database Concurrency,大问题 我正在用PHP和MySQL实现一个在线售票系统。我有一张桌子叫“积木票”之类的东西 此表看起来像: +-----------+------------+--------------+--------------+--------------+ | idblock | block_name | total_tickets| block_gender | idblock_pair | +-----------+------------+--------------+-----------

大问题

我正在用PHP和MySQL实现一个在线售票系统。我有一张桌子叫“积木票”之类的东西

此表看起来像:

+-----------+------------+--------------+--------------+--------------+ | idblock | block_name | total_tickets| block_gender | idblock_pair | +-----------+------------+--------------+--------------+--------------+ | 1 | Block 1- M | 100 | MALE | 2 | +-----------+------------+--------------+--------------+--------------+ | 2 | Block 1- F | 100 | FEMALE | 1 | +-----------+------------+--------------+--------------+--------------+ +-----------+------------+--------------+--------------+--------------+ |idblock | block | name | total |门票| block | gender | idblock | pair| +-----------+------------+--------------+--------------+--------------+ |1 | 1区-M | 100 |男| 2| +-----------+------------+--------------+--------------+--------------+ |2 | 1座-F | 100 |女| 1| +-----------+------------+--------------+--------------+--------------+ 其中:

  • idblock:票据块的id(主键)
  • 块\u名称:块的名称。在这个例子中,我有一个“block1-M”和“block1-F”分别代表“block1-Male”和“block1-Female”
  • 总票数:可用票数的总数
  • 区块性别:区块门票的性别
  • idblock\u对:块是当前块的对
  • 注意:还有其他列,如“价格”等。

    这是一个(大)问题:

  • 当存在“idblock\u pair”时,这意味着两个票证块将共享相同的总票证(可用票证),因此在这种情况下,两个单元格必须具有完全相同的值。正如您在上面的示例中所看到的,块1指向块2,反之亦然

  • 很多人(几乎)在同一时间购买了很多票,这意味着每一张售出的票必须在“total_tickets”字段中对两个单元格都减少1

  • 数据库规范化可以解决这个问题。然而,它在性能上会损失很多

    我几乎可以肯定我应该使用“选择…进行更新”。。。但我不知道怎么做,因为它是同一个表,可能会发生“死锁”

    如何解决这个问题?我必须使用触发器吗?程序?我必须使用PHP处理(和事务)来解决这个问题吗


    在下面的示例中,售出了一张票,现在我将总票数减少1:

    START TRANSACTION; SELECT * FROM block_of_tickets WHERE idblock in (1,2) FOR UPDATE; UPDATE block_of_tickets SET total_tickets = (total_tickets - 1) WHERE idblock in (1,2); COMMIT; 启动交易; 选择* 从一排票开始 其中idblock在(1,2)中用于更新; 更新\u块的\u票证 设置总票数=(总票数-1) 式中为(1,2); 犯罪
    这是一个很好的解决方案吗?

    如果我理解,那么为什么不简单的更新
    更新块\u票证设置total\u票证=total\u票证-1,其中idblock=solded\u票证id或idblock\u对=solded\u票证id
    ?“idblock\u对”或“idblock”永远不会是“solded\u票证id”。。。焊接的票据存储在另一个表中,外键为“idblock”和“iduser”。问题在于数据库的并发性——许多用户对同一资源存在争议。如果两个人同时购买两张票,在某些情况下可能会导致两个单元格之间的数据库不一致。