Конкретный вопрос на собеседовании, на который никто не может ответить
Я всех спрашиваю, как в MySQL эмулировать (средствами MySQL) запрет на использования индексов, чтобы:
(а) реализовать поведение AUTO_INCREMENT: скрипты вставляют что-то в базу (сообщение), при этом в колонке ID должен записываться последовательно увеличающийся номер, без дыр, без наложения данных, без дублирования ID.
(б) вставить новую строку (x="y") в базу, если ее там еще нет и сообщить на экран - удалось ли вставить, либо же нет (другой поток первым успел вставить *эту* же строку).
Вариант (б) я даю, чтобы за автоинкременте люди не зацикливались. Напоминаю, индексы запрещены условиями задачи.
Все выполняется в 1000 параллельных потоков (возможно, не только на PHP, а сразу на PHP+C+JAVA+...). Ваще никто ни разу не ответил на этот примитивный вопрос.
Если 1 поток, то все элементарно:
(а)
$max=$db("SELECT max(id) ") + 1;
$db("INSERT ... SET id=$max")
(б)
if ($db("SELECT ... WHERE x='y' ")) { $db("INSERT ... SET x='y' "); echo "готово!"; } else { echo "облом"; }
Если же это работает в 2 и более потоков, то естественно, между двумя запросами вклинятся другие потоки и все будет испорчено (несколько потоков сделают INSERT, создав дублирующиеся строки с одинаковыми ID или X="Y").
Есть куча идиотских вариантов ответа, да и то от очень небольшого числа кандидатов: вложенные запросы, блокировка таблицы целиком (это я засчитываю за отдаленный ответ), задействовать другие таблицы, лок в файлы/мемкеш/семафоры, изменить характер запросов и логику программы (например, вставлять ID пустым,и потом че-то доделывать) и т.д.
Я думаю, здесь тоже никто ответа не знает (кроме, человек 5 с форума). Почему это такой трудный вопрос?..
Я всех спрашиваю, как в MySQL эмулировать (средствами MySQL) запрет на использования индексов, чтобы:
(а) реализовать поведение AUTO_INCREMENT: скрипты вставляют что-то в базу (сообщение), при этом в колонке ID должен записываться последовательно увеличающийся номер, без дыр, без наложения данных, без дублирования ID.
(б) вставить новую строку (x="y") в базу, если ее там еще нет и сообщить на экран - удалось ли вставить, либо же нет (другой поток первым успел вставить *эту* же строку).
Вариант (б) я даю, чтобы за автоинкременте люди не зацикливались. Напоминаю, индексы запрещены условиями задачи.
Все выполняется в 1000 параллельных потоков (возможно, не только на PHP, а сразу на PHP+C+JAVA+...). Ваще никто ни разу не ответил на этот примитивный вопрос.
Если 1 поток, то все элементарно:
(а)
$max=$db("SELECT max(id) ") + 1;
$db("INSERT ... SET id=$max")
(б)
if ($db("SELECT ... WHERE x='y' ")) { $db("INSERT ... SET x='y' "); echo "готово!"; } else { echo "облом"; }
Если же это работает в 2 и более потоков, то естественно, между двумя запросами вклинятся другие потоки и все будет испорчено (несколько потоков сделают INSERT, создав дублирующиеся строки с одинаковыми ID или X="Y").
Есть куча идиотских вариантов ответа, да и то от очень небольшого числа кандидатов: вложенные запросы, блокировка таблицы целиком (это я засчитываю за отдаленный ответ), задействовать другие таблицы, лок в файлы/мемкеш/семафоры, изменить характер запросов и логику программы (например, вставлять ID пустым,и потом че-то доделывать) и т.д.
Я думаю, здесь тоже никто ответа не знает (кроме, человек 5 с форума). Почему это такой трудный вопрос?..