|
|
Cadenats d'exclusió mútuaJoan Puigcerver Ibáñez Introducció¶Les bases de dades tenen una arquitectura client-servidor, on el servidor és el responsable de gestionar l'accés a les dades. Aquest accés pot ser concurrent, és a dir, que diversos clients accedeixen a les dades al mateix temps. Això pot provocar problemes si no es controla correctament. Un dels principals problemes derivats de l'accés concurrent és la condició de carrera. Aquesta condició es produeix quan dos o més processos intenten accedir a la mateixa dada al mateix temps, i el resultat depèn de l'ordre en què s'executen els processos. Exemple A partir de la base de dades Perill Aquest exemple és purament teòric i no es pot executar directament en una base de dades
ja que el motor InnoDB de MySQL bloqueja automàticament les files involucrades
en les sentències Vegeu Material d'ampliació per a més informació.
Si les operacions s'executen en l'ordre (1), (2), (3), (4), (5) i (6), el resultat serà correcte. Però si les operacions s'executen en l'ordre (1), (4), (2), (5), (3) i (6), el resultat serà incorrecte.
Per evitar aquest tipus de problemes, es fan servir cadenats d'exclusió mútua (mutex, MUTual EXclusion o locks en anglés). Aquests cadenats permeten que només un procés puga accedir a una dada en un moment determinat, evitant així que diferents operacions concurrents puguen accedir i modificar la mateixa dada al mateix temps. Bloqueig de taules¶En les bases de dades MySQL es poden bloquejar les taules amb la sentència Documentació Documentació oficial sobre La sintaxi és la següent:
Quan una taula és bloquejada, cap altra connexió pot accedir a la taula. Si ho intenta, la connexió quedarà en espera fins que la taula siga desbloquejada. Per desbloquejar una taula, s'utilitza la sentència Documentació Documentació oficial sobre La sintaxi és la següent: Aquesta sentència desbloqueja totes les taules bloquejades per la connexió actual. No obstant això, aquesta sentència no és necessària si es fa servir la sentència Perill A una transacció, si s'utilitza la sentència Si es tracta d'accedir o modificar una taula que no està bloquejada, es produeix l'error Informació: https://stackoverflow.com/questions/36467298/mysql-table-my-table-was-not-locked-with-lock-tables Exemple Si en l'exemple haguerem bloquejat la taula
En el cas que les operacions s'executen en l'ordre (L1), (1), (L2), (4), (2), (5), (3) i (6), on abans el resultat era incorrecte, ara el resultat és correcte.
Bloqueig de files¶El bloqueig de taules és una eina molt potent, però també molt restrictiva. Si es bloqueja una taula, cap altra connexió pot accedir a la taula fins que siga desbloquejada. Això pot provocar problemes de rendiment si es bloqueja una taula que és molt utilitzada. Per aquest motiu, les bases de dades modernes permeten el bloqueig de files, on només es bloqueja la fila que es vol modificar, i no la taula sencera. En MySQL, el bloqueig de files es pot fer amb la sentència Documentació Documentació oficial sobre bloqueig de files:
Aquesta sentència sols bloqueja les files que han segut seleccionades. La sintaxi és la següent: El tipus de bloqueig són:
Aquest tipus de bloqueig pot afectar múltiples taules si es fan servir
sentències No hi ha cap sentència Exemple En l'exemple anterior, si en lloc de bloquejar la taula
En el cas que les operacions s'executen en l'ordre (L1), (1), (L2), (4), (2), (5), (3) i (6), on abans el resultat era incorrecte en el primer exemple, ara el resultat és correcte.
Material d'ampliació¶Documentació Documentació oficial sobre nivells d'aïllament de transaccions:
Documentació oficial sobre bloqueig de taules implícit: Bibliografia¶📌 Aquest document pot quedar desactualitzat després d’imprimir-lo. Pots consultar la versió més recent
a la pàgina web.
🌿 Abans d’imprimir aquest document, considera si és realment necessari. Redueix el consum de paper i ajuda a protegir el nostre entorn.
|