我在制作游戏时有一些抽奖活动,我有建议从MyISAM切换到InnoDB并开始使用FOR UPDATE
,所以彩票(从1到16)可以不能多卖一次。SELECT FOR UPDATE WITH INSERT INTO
现在我想知道,FOR UPDATE
是如何工作的。
我已经看到了网络上,它是这样的:
SELECT * FROM [table] WHERE [column] = [value] FOR UPDATE
UPDATE [table] SET [column] = [new_value]
但我的问题是关于以下,将它也为INSERT
工作?
我的数据库设计:
CREATE TABLE IF NOT EXISTS `Lottery` (
`id` varchar(50) NOT NULL,
`preferedLotteryId` varchar(50) NOT NULL,
`winningTicketId` int(11) NOT NULL DEFAULT '-1',
`createdOn` datetime NOT NULL DEFAULT '1001-00-00 00:00:00',
`startedOn` datetime NOT NULL DEFAULT '1001-00-00 00:00:00',
`finishedOn` datetime NOT NULL DEFAULT '1001-00-00 00:00:00',
`active` tinyint(1) NOT NULL,
`deliveredOn` datetime NOT NULL DEFAULT '1001-00-00 00:00:00',
`preferedDeliverMethod` int(2) NOT NULL DEFAULT '-1',
`deliveredMethod` int(2) NOT NULL DEFAULT '-1',
`deliveredByAccountId` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `LotteryBid` (
`bidId` varchar(50) NOT NULL,
`accountId` varchar(50) NOT NULL,
`auctionId` varchar(50) NOT NULL,
`ticketId` int(50) NOT NULL,
`datetime` datetime NOT NULL DEFAULT '1001-00-00 00:00:00',
PRIMARY KEY (`bidId`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
这意味着这种设计将需要FOR UPDATE
类似于:
SELECT * FROM Lottery WHERE id = [id] FOR UPDATE
INSERT INTO LotteryBids SET [LotteryBids.values & Lottery.id]
或
SELECT * FROM Lottery WHERE id = [id] FOR UPDATE
INSERT INTO LotteryBids, Lottery SET [LotteryBids.values] WHERE Lottery.id = [id]
但是,我不知道这是否方式FOR UPDATE
甚至可能会略有可能。
我对这种海量数据交互相当陌生,我不知道从哪里开始。
我希望你们中的一些人能帮助我。
亲切的问候, Larssy1
我认为下面的想法会转变为一个可能的解决方案:
思考1:
用户正在购买彩票与门票ID 5.目前这个 彩票已售出3张门票,所以我想锁定这个 彩票的行数,直到我h大家承诺/完成了这个插入。
思考2:
用户正在购买带票ID彩票5.目前这个 拍卖与票号5无人售票,所以我想保留一个条目 这次拍卖具有类似的拍卖ID和票证ID。在查询完成之前, 会阻止进一步添加。
使用的查询
选择彩票(包括附加信息):
SELECT au.*, asp.* FROM Lottery au, LotteryPrefered asp
WHERE au.preferedAuctionId = asp.id AND au.id = '" . $_auctionId . "'
OR(不含附加信息)
SELECT au.* FROM Lottery au
WHERE au.id = '" . $_auctionId . "'
购买蜱等:
INSERT INTO LotteryBids (bidId, accountId, auctionId, ticketId, datetime)
VALUES ('" . $guid . "', '" . $_accountId . "', '" . $_auctionId . "',
'" . $_ticketId . "', NOW())
我猜你的'INSERT'语句是伪代码,但'WHERE'子句在INSERT语句中完成了什么? –
这几乎只是为了给'FOR UPDATE'敲'',''更新'发生了。但我不知道它是如何工作的。 – larssy1