Вопрос заключается в том, если два разных пользователей голосов одновременно его возможно, что два экземпляра кода попытаться вставить новый идентификатор (или какой-либо подобный тип запроса), что даст ERRO
Да, вы можете получить два запроса, сделанных вставкой. В зависимости от ограничений в таблице один из них либо генерирует ошибку, либо вы получите две строки в своей базе данных.
Вы можете решить это, я считаю, с применением некоторой блокировки; , например.если вам нужно добавить голос к продукту с идентификатором theProductId: (псевдокод)
START TRANSACTION;
//lock on the row for our product id (assumes the product really exists)
select 1 from products where id=theProductId for update;
//assume the vote exist, and increment the no.of votes
update votes set numberOfVotes = numberOfVotes + 1 where productId=theProductId ;
//if the last update didn't affect any rows, the row didn't exist
if(rowsAffected == 0)
insert into votes(numberOfVotes,productId) values(1,theProductId)
//insert the new vote in the per user votes
insert into user_votes(productId,userId) values(theProductId,theUserId);
COMMIT;
Некоторые подробнее here
MySQL предлагает другое решение, а также, которые могут быть применимы здесь, insert on duplicate
например вы могли бы просто сделать:
insert into votes(numberOfVotes,productId) values(1,theProductId) on duplicate key
update numberOfVotes = numberOfVotes + 1;
Если ваши голоса таблица имеет уникальный ключ на колонке ID продукта, выше будет сделать вставку, если конкретный theProductId не существует, в противном случае он будет делать обновить, где он увеличивает столбцы numberOfVotes на 1
Возможно, вы могли бы избежать этого, если бы вы создали строку в таблице голосов одновременно с добавлением продукта в базу данных. Таким образом, вы можете быть уверены, что всегда есть строка для вашего продукта и просто введите UPDATE в этой строке.
Это может помочь показать структуру вашей таблицы (имена таблиц и столбцов) – rojoca
Я просто приведу пример, но чтобы помочь вам: в таблице продуктов есть идентификаторы productID, vote_count и total_votes_value. В таблице user_product_votes есть идентификатор пользователя, идентификатор productID и столбец user_vote. – Jonathan
Единственная причина, по которой я спрашиваю, что в этом примере кажется, что было бы лучше реорганизовать вашу логику и структуру таблицы, чтобы одновременные вставки не имели значения, а не пытаясь предотвратить их. Вы задаете общий вопрос или вам нужно решить конкретную проблему в вашем примере? – rojoca