大问题......
我在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 | +-----------+------------+--------------+--------------+--------------+
其中:
注意:还有其他列,例如"价格"等
这是(大)问题:
如果有" idblock_pair ",则表示两个故障单块将共享相同的total_tickets(可用故障单),因此两个单元格必须完全相同在这种情况下相同的值。正如您在上面的示例中所看到的,块1指向块2,反之亦然。
很多人在(几乎)同时购买大量门票,这意味着每张售出的门票必须在" total_tickets"两个单元格的字段。
数据库规范化可以解决这个问题。但是,它会失去很多性能。
我几乎可以肯定我应该使用" 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;
这是一个不错的解决方案吗?