Domanda

Ho una tabella di InnoDB che contiene gli utenti, in questo modo:

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

In ogni inserto ho incremento id_utente da 1 così per esempio, il prossimo user_id per Bob sarà 4

Io uso questa query per farlo:

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

Ora ho bisogno di fare in modo che due utenti diversi non aggiungere un 'Bob', allo stesso tempo. Non voglio nessun due Bobs con id_utente 4. Ciascuna di Bob ID utente deve essere diverso.

È possibile scrivere e blocco di aggiornamento tutti i filari di Bob quando la query sopra inserto viene eseguita? Non posso bloccare l'intera tabella, perché molti altri utenti hanno ancora bisogno di pieno accesso ai loro file. Inoltre, tutte le righe devono essere leggibili in ogni momento. Come faccio a fare questo?

È stato utile?

Soluzione

Supponendo InnoDB qui, è possibile utilizzare SELECT. .. BLOCCO IN SHARE MODE per bloccare le righe quando si seleziona loro.

Altri suggerimenti

Per risolvere la prima parte della sua domanda, creare un indice univoco su user_id e il nome.

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

che impedirà id_utente duplicati, record di nomi.

La risposta a questa domanda è la stessa di questo . InnoDB si bloccherà più righe qui che ci si aspetta per la sicurezza con la registrazione binaria dichiarazione-based.

La soluzione:. il log binario basato utilizzo fila con il livello di isolamento read-committed

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top