Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

219
Views
¿Cómo permite MySQL adquirir un bloqueo compartido cuando otra transacción tiene un bloqueo exclusivo?

Estoy tratando de entender cómo funcionan las transacciones y me encontré con un escenario que no tiene mucho sentido para mí. Esperaba que alguien pudiera ayudarme a entenderlo.

tengo dos transacciones

transacción 1

 BEGIN; update data set val = val + 1 where id = 1

transacción 2

 BEGIN; select * from data

Tengo dos terminales abiertas, comienzo la primera transacción y ejecuto la consulta de actualización. Esto supuestamente otorga el bloqueo exclusivo a la transacción 1 en la tupla con id 1.

Después de eso, ejecuto la segunda consulta en otra terminal antes de realizar la primera transacción. Esperaba que se detuviera, ya que la primera transacción tiene el bloqueo exclusivo que evitará que esta transacción adquiera el bloqueo de lectura en la tupla con id 1.

Sin embargo, mysql ejecuta la consulta de selección y devuelve los datos "no sucios".

¿Alguien puede darme la explicación detrás de este comportamiento de mysql?

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

SELECT no requiere un bloqueo de fila compartido de forma predeterminada. Puede leer la versión confirmada más reciente de la fila sin bloquear, mediante el uso de la arquitectura de control de concurrencia de múltiples versiones (MVCC) .

Puede escribir una consulta SELECT que solicite explícitamente un bloqueo , pero sin estas cláusulas de bloqueo, SELECT no requiere bloqueos de fila.

over 4 years ago · Santiago Trujillo Report

0

Para tener una visión completa de cómo funcionan las transacciones, creo que tiene sentido tener en cuenta que los bloqueos compartidos se adquieren de manera diferente, según el nivel de aislamiento.

Los bloqueos exclusivos se liberan cuando finaliza la transacción, independientemente del nivel de aislamiento.

La diferencia entre los niveles de aislamiento se refiere a la forma en que se adquieren/liberan los bloqueos compartidos (de lectura).

En el nivel de aislamiento Lectura no confirmada, no se adquieren bloqueos compartidos. Bajo este nivel de aislamiento, puede ocurrir el problema de simultaneidad conocido como "Lecturas sucias".

En el nivel de aislamiento de lectura confirmada, se adquieren bloqueos compartidos para los registros en cuestión. Los bloqueos compartidos se liberan cuando finaliza la instrucción actual. Este nivel de aislamiento evita las "lecturas sucias" pero, dado que el registro puede ser actualizado por otras transacciones simultáneas, pueden ocurrir "lecturas no repetibles" o "lecturas fantasma".

En el nivel de aislamiento de lecturas repetibles, los bloqueos compartidos se adquieren durante la duración de la transacción. Se evitan las "lecturas sucias" y las "lecturas no repetibles", pero aún pueden ocurrir "lecturas fantasma".

En el nivel de aislamiento serializable, los bloqueos compartidos de rango se adquieren durante la duración de la transacción. No se produce ninguno de los problemas de simultaneidad mencionados anteriormente, pero el rendimiento se reduce drásticamente y existe el riesgo de que se produzcan interbloqueos.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!