Итак, я имею дело с проектом, в котором у нас есть объекты, имеющие имя, и хотя несколько объектов могут иметь одно и то же имя, только один из этих объектов может быть активным одновременно. Поэтому для каждого обновления/вставки, если новый/обновленный объект имеет
active = TRUE, все остальные записи с таким именем должны иметь
active = FALSE.
Моя проблема в том, что если две вставки происходят одновременно, то, похоже, бывают случаи, когда две записи заканчиваются
active = TRUEс тем же именем, я думаю, потому что, когда база данных проверяется на наличие записей с этим именем, для которых установлено значение false, ни одна из строк не присутствует, и поэтому программа приходит к выводу, что обе записи могут иметь
active = TRUEнесмотря на то, что у него одно и то же имя.
Чтобы привести пример в псевдокоде:
CREATE TABLE entity ( id INT(11), name VARCHAR(50), active bit(1) );
когда я получаю новую пластинку с названием «имя», я делаю ВЫБЕРИТЕ идентификатор ИЗ объекта ГДЕ имя = 'имя' И активный = ИСТИНА; Я получаю идентификатор этого объекта, назовем его, затем обновляю эту запись.
UPDATE entity SET active=FALSE WHERE id=<IDNUM>
Затем я вставляю новую запись
INSERT INTO entity (id,active) VALUES ('name',TRUE)
Насколько я могу судить, эта настройка не может работать, если я каким-то образом не заблокирую всю таблицу для каждой вставки/обновления, чтобы предотвратить одновременные обновления.
Альтернатива, о которой я думаю, — это отсутствие активного столбца, а наличие второй таблицы, например
CREATE TABLE active_entity ( name VARCHAR(50), active_record INT(11) );
где
active_recordэто внешний ключ, идущий к таблице сущностей, и когда мне нужны активные записи, просто выполните соединение через него. Есть ли способ избежать этого?
Для справки: я использую mysql 8.0 , но мне интересно, как это будет работать с другими базами данных.