En el ejemplo de código que proporcionó, todas las lecturas de esa fila verán el valor anterior hasta que se confirme esa transacción.
1) Considere que el ejemplo de código se ejecuta dos veces simultáneamente, con el mismo valor de X
. Si la instancia A se ha ejecutado select ... for update
, ha bloqueado esa fila hasta que se confirma. La instancia B, haciendo lo mismo, se bloqueará al tratar de tomar el bloqueo de la misma manera. Solo cuando A se compromete, B puede continuar. B recibirá el valor que A dejó en su actualización final.
Si Y
depende de qué valor select ... for update
lea la consulta u otra lectura de la misma en la parte 'compleja', esto tendrá el mismo efecto que si se ejecutara en serie: no se obtiene la condición de carrera donde se obtendrá uno de los resultados descartado.
Si Y
es puramente el resultado de consultas complejas en el medio, ejecutarlo en paralelo sin select ... for update
que ambos realicen la misma actualización.
2) for share
permitirá que continúen otras selecciones en esa fila, pero hará que cualquier otra cosa intente select ... for update
o update ...
bloquee hasta que se haga. Si el código de muestra se ejecutó dos veces, al mismo tiempo, se estancarían al llegar a la update
declaración, lo que provocaría que uno de ellos se cancelara.
3) No. Hacer esto es peligroso, ya que un lector podría leer un campo medio actualizado. (O lea el resto de un campo actualizado después del inicio de la lectura). También puede romper la coherencia, mostrando al lector un valor actualizado después del inicio de su transacción.