LINUX.ORG.RU

История изменений

Исправление firkax, (текущая версия) :

Ну, я бы так сделал:

1) эксклюзивная блокировка таблицы (в терминах mysql она называется блокировкой на запись)

2) селект с проверкой наличия конфликта, если конфликт есть то выдаём ошибку и идём п.4

3) если конфликта нет - вставляем строку

4) снимаем блокировку

Поскольку тут тривиальная вставка одной строки, и тривиальный селект по индексу (ну, должен быть по индексу, если индекса нет надо создать), делаться всё должно мгновенно и блокировка никому не помешает.

Хотя есть ещё один костыльный способ, для mysql, связанный с тем что оно считает NULL всегда уникальным. Можно сделать уникальный ключ по не по трём колонкам, а по четырём. В четвёртой будет либо какое-то значение (везде одинаковое), если дубликаты запрещены, либо NULL если разрешены. Тогда никаких доп. проверок на клиенте делать не надо, база сама разберётся. Оно подойдёт, если логика ограничивается только поиском дубликатов по всем трём полям в зависимости от их значения. Если сложнее - то только способ выше.

Исправление firkax, :

Ну, я бы так сделал:

1) эксклюзивная блокировка таблицы (в терминах mysql она называется блокировкой на запись)

2) селект с проверкой наличия конфликта, если конфликт есть то выдаём ошибку и идём п.4

3) если конфликта нет - вставляем строку

4) снимаем блокировку

Поскольку тут тривиальная вставка одной строки, и тривиальный селект по индексу (ну, должен быть по индексу, если индекса нет надо создать), делаться всё должно мгновенно и блокировка никому не помешает.

Хотя есть ещё один костыльный способ, для mysql, связанный с тем что оно считает NULL всегда уникальным. Можно сделать уникальный ключ по не по трём колонкам, а по четырём. В четвёртой будет либо какое-то значение (везде одинаковое), если дубликаты запрещены, либо NULL если разрешены. Тогда никаких доп. проверок на клиенте делать не надо, база сама разберётся.

Исходная версия firkax, :

Ну, я бы так сделал:

1) эксклюзивная блокировка таблицы (в терминах mysql она называется блокировкой на запись)

2) селект с проверкой наличия конфликта, если конфликт есть то выдаём ошибку и идём п.4

3) если конфликта нет - вставляем строку

4) снимаем блокировку

Поскольку тут тривиальная вставка одной строки, и тривиальный селект по индексу (ну, должен быть по индексу, если индекса нет надо создать), делаться всё должно мгновенно и блокировка никому не помешает.