Pregunta

Tengo una tabla InnoDB que contiene los usuarios, así:

+--------------+-----------------------+
| user_id      | name                  |
+--------------+-----------------------+
| 1            | Bob                   |
| 1            | Marry                 |
| 2            | Bob                   |
| 1            | John                  |
| 3            | Bob                   |
| 2            | Marry                 |
+--------------+-----------------------+

En cada inserto I Incremento user_id por 1 así que por ejemplo, el siguiente user_id para Bob será 4

Yo uso esta consulta para hacer esto:

INSERT INTO users (user_id, name)
SELECT 1 + coalesce((SELECT max(user_id) FROM users WHERE name='Bob'), 0), 'Bob';

Ahora necesito para asegurarse de que dos usuarios diferentes no añaden un 'Bob' al mismo tiempo. No quiero que cualquier par de sacudidas con user_id 4. Cada uno de los identificadores de usuario de Bob debe ser diferente.

Es posible escribir y actualizar toda bloqueo de filas de Bob cuando se ejecuta la consulta anterior de inserción? No puedo bloquear toda la tabla, ya que muchos usuarios todavía tienen pleno acceso a sus filas. Además, todas las filas deben ser legibles en todo momento. ¿Cómo puedo hacer esto?

¿Fue útil?

Solución

Suponiendo InnoDB aquí, puede utilizar SELECT. .. bLOQUEO eN MODO dE ACCIÓN para bloquear las filas cuando se selecciona ellos.

Otros consejos

Para resolver la primera parte de su pregunta, crear un índice único en user_id y el nombre.

alter table `users` add unique index ak_user_id_name(user_id,name);

Eso evitará que user_id duplicado, los registros de nombres.

La respuesta a esta pregunta es la misma que éste . InnoDB se bloqueará aquí más filas de lo esperado para la seguridad con el registro binario basado en la declaración.

La solución:. registro binario basado en el uso fila con el nivel de aislamiento de lectura confirmada-

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top