如何在同一个表中同步单元格值?

时间:2017-04-19 07:00:49

标签: php mysql database-deadlocks optimistic-concurrency database-concurrency

大问题......

我在PHP和MySQL中实施在线售票系统。我有一个名为" block_of_tickets"的表,或类似的......

此表格如下:

+-----------+------------+--------------+--------------+--------------+
| idblock   | block_name | total_tickets| block_gender | idblock_pair |
+-----------+------------+--------------+--------------+--------------+
|     1     | Block 1- M |     100      |     MALE     |      2       |
+-----------+------------+--------------+--------------+--------------+
|     2     | Block 1- F |     100      |    FEMALE    |      1       |
+-----------+------------+--------------+--------------+--------------+

其中:

  1. idblock:门票块的ID(主键)。
  2. block_name:块的名称。在这个例子中,我有一个" Block 1- M"和" Block 1- F"代表" Block 1 - Male"和"第1区 - 女性"分别。
  3. total_tickets:可用票证总数
  4. block_gender:门票的性别
  5. idblock_pair:该块是当前块的对。
  6. 注意:还有其他列,例如"价格"等

    这是(大)问题:

    1. 如果有" idblock_pair ",则表示两个故障单块将共享相同的total_tickets(可用故障单),因此两个单元格必须完全相同在这种情况下相同的值。正如您在上面的示例中所看到的,块1指向块2,反之亦然

    2. 很多人在(几乎)同时购买大量门票,这意味着每张售出的门票必须在" total_tickets"两个单元格的字段。

    3. 数据库规范化可以解决这个问题。但是,它会失去很多性能。

      我几乎可以肯定我应该使用" SELECT ... FOR UPDATE" ...但我不知道如何,因为它是同一张桌子,和#34;僵局"会发生......

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

      在下面的例子中,售出了一张票,现在我将 total_tickets 减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;
      
      

      这是一个不错的解决方案吗?

0 个答案:

没有答案