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 Ydepende de qué valor select ... for updatelea 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 Yes puramente el resultado de consultas complejas en el medio, ejecutarlo en paralelo sin select ... for updateque ambos realicen la misma actualización.
2) for sharepermitirá que continúen otras selecciones en esa fila, pero hará que cualquier otra cosa intente select ... for updateo 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 updatedeclaració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.