我在製作遊戲時有一些抽獎活動,我有建議從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