【发布时间】:2014-02-11 05:29:54
【问题描述】:
我正在制作某种游戏彩票,我得到了从 MyISAM 切换到 InnoDB 并开始使用 FOR UPDATE 的建议,因此彩票(从 1 到 16 不等)无法卖出更多不止一次。
现在我想知道,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 这种方式是否有可能。
我对这种海量数据交互还很陌生,我不知道从哪里开始。
我希望你们中的一些人可以帮助我。
亲切的问候, 拉西1
我认为以下想法会转化为可能的解决方案:
想法一:
一个用户正在购买一张彩票 ID 为 5 的彩票。目前这个 彩票已售出 3 张彩票,所以我想为此锁定行数 抽签,直到我提交/完成此插入。
想法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一个小小的“敲门”,发生了一个“更新”。但我不知道它实际上是如何工作的。
标签: mysql select insert transactions innodb