В этой теме речь о race condition при добавлении записи в таблицу один из столбцов которой должен иметь уникальное значение (не повторяться) уже поднимался. Решение было найдено - добавить UNIQUE constraint к соответствующему столбцу в таблице и проверять возвращает ли mysql_query ошибку.
Теперь задача усложняется. Представим что у нас есть 2 таблицы `packages` и `files`. Каждый файл должен быть ассоциирован с package.
create table packages (
id bigint unsigned auto_increment primary key,
name varchar(255) not null
);
create table files (
id bigint unsigned auto_increment primary key,
name varchar(255) not null,
path varchar(255) not null,
package_id bigint unsigned not null
);
Здесь package_id ассоциирует файл с package.id.
Каким образом сделать так что бы files.name был уникальным для файлов из одного package'а? Очевидно что сделать files.name UNIQUE не явл. решением т.к. name должно быть уникально только в пределах одного package_id.
Такой код:
$q = mysql_query("SELECT COUNT(id) AS fn_ex FROM files WHERE name = '$file_name' AND package_id = '$package_id'");
$row = mysql_fetch_assoc($q);
mysql_free_result($q);
if ($row['fn_ex'] > 0) {
$errors[] = "File name already in use";
} else {
mysql_query("INSERT INTO files SET name = '$name', path = '$path', package_id = '$package_id'");
}
подвержен race condition'у (подробно описанному в предыдущей теме).
Так что же делать?