У меня есть какая-то игровая лотерея, и у меня есть совет переключиться с MyISAM на InnoDB и начать использовать FOR UPDATE
, поэтому лотерейный билет (от 1 до 16) может не продаются более одного раза.ВЫБЕРИТЕ ДЛЯ ОБНОВЛЕНИЯ с 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 проданных билетов, поэтому я хочу заблокировать количество строк для этой лотереи , пока я не ave совершил/завершил эту вставку.
Мысль 2:
Пользователь покупает лотерейный билет с идентификатором билета 5. В настоящее время этого аукцион не имеет билета с билетным идентификатором 5, поэтому я хочу, чтобы зарезервировать запись для этого аукциона с аналогичным идентификатором аукциона и идентификатором билета. И предотвращают дальнейшие добавления до завершения этого запроса.
Используемые запросы
Выберите лотерею (в том числе дополнительной информации):
SELECT au.*, asp.* FROM Lottery au, LotteryPrefered asp
WHERE au.preferedAuctionId = asp.id AND au.id = '" . $_auctionId . "'
ИЛИ (за исключением дополнительной информации)
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