Есть у меня некая таблица, допустим из двух столбцов: id int (primary key, autoincrement), name varchar(255) (unique index).
С этой таблицей работают (пишут и читают) много потоков одновременно.
Задача:
- Клиент подключается, проверяет есть ли в таблице в поле name некое значение: SELECT `id` FROM `table` WHERE `name` = 'Vasya'
- Если оно есть, то id возвращается клиенту, тут вопросов нет
- Если же его нет, то нужно добавить туда строку и опять же вернуть id клиенту (last_insert_id)
- При этом важно что одну и ту же строку могут искать и пытаться добавить сразу много клиентов. Хочется чтобы этот момент не вызывал deadlock-ов, отката транзакций и подобных бед.
- То есть, должна быть некая атомарность - кто первый пришёл и спросил о наличии строки в таблице, в случае её отсутствия, и должен иметь возможность её добавить. А остальные уже должны будут получить её id.
Я правильно понимаю, что без блокировки *всей* таблицы на чтение и запись на время транзакции этого реализовать не получится?