La pregunta es, si dos usuarios diferentes votaciones simultáneamente su posible que las dos instancias del código intenta insertar un nuevo ID (o algún tipo similar de consulta) que le dará un erro
Sí, es posible que termine con dos consultas al insertar. Según las restricciones de la tabla, una de ellas generará un error o terminarás con dos filas en tu base de datos.
Puede resolver esto, creo, con la aplicación de un bloqueo; p.Si es necesario agregar un voto para el producto con theProductId id: (pseudo código)
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;
Algunos más información here
MySQL ofrece otra solución, así, que podría ser aplicable en este caso, insert on duplicate
por ejemplo usted podría ser capaz de simplemente hacer:
insert into votes(numberOfVotes,productId) values(1,theProductId) on duplicate key
update numberOfVotes = numberOfVotes + 1;
Si los votos de la tabla tienen una clave única en la columna de la identificación del producto, lo anterior se hacer una inserción si no existe la theProductId en particular, de lo contrario se hará una update, donde incrementa la columna numberOfVotes por 1
Probablemente pueda evitar mucho de esto si crea una fila en la tabla de votos al mismo tiempo que agrega el producto a la base de datos. De esta forma, puede estar seguro de que siempre hay una fila para su producto, y simplemente emita una ACTUALIZACIÓN en esa fila.
Puede ser útil mostrar la estructura de su tabla (nombres de tabla/columna) – rojoca
Solo estoy dando un ejemplo pero para ayudarlo: la tabla product_votes tiene un productID, un votes_count y una columna total_votes_value. La tabla user_product_votes tiene un ID de usuario, un IdProducto y una columna usuario_voto. – Jonathan
La única razón por la que pregunto es que en este ejemplo parece que sería mejor reorganizar la lógica y la estructura de la tabla para que las inserciones simultáneas no importen en lugar de tratando de prevenirlos. ¿Hace una pregunta general o necesita resolver el problema específico en su ejemplo? – rojoca