Recientemente ejecuté una consulta de actualización contra 100,000 registros. Me di cuenta de que había cometido un error mientras se ejecutaba la consulta y desconecté rápidamente el cable de red.
¿La consulta de actualización
- dejar de procesar y deshacer por completo?
- continuar procesando hasta completar y comprometerse?
- ¿dejar de procesar y dejar solo parte de las filas de destino actualizadas?
sql-server
network
robocop
fuente
fuente
Respuestas:
Como lo mencionaron Nick y Martin, el estado eventual de su consulta depende de si SQL Server conoce la extracción de cable de su red antes de que se complete la consulta. De Books Online (aunque me parece interesante que haya temas equivalentes para esto en 2000 , 2005 , 2008 y 2008 R2 , pero no en 2012 o 2014):
(Por otro lado, las conexiones de palabras en la 2da última oración probablemente fueron transacciones . No sé cómo se deshace una conexión).
De manera similar, SQL Server puede deshacer o rehacer transacciones durante la recuperación después de que el servidor se cierre inesperadamente, y esto dependerá del estado de la transacción en el momento del cierre. He visto a personas usar esta táctica para lograr lo que estaba tratando de hacer (cancelar las transacciones) y cuando el servidor se inició nuevamente, gran parte del trabajo fue simplemente rehecho (por lo que el efecto neto de su reacción instintiva estuvo mucho más cerca a cero de lo que esperaban).
Entonces, en lugar de estar sujeto a esto, en lugar de hacer cosas drásticas en pánico, como tirar de un cable de red o apagar la máquina, sugiero que en el futuro tenga una mejor disciplina sobre la ejecución de consultas ad hoc contra sistemas importantes. Por ejemplo, en lugar de:
Tengo esto:
Luego, si la actualización fue correcta, puede resaltar la
COMMIT
parte y ejecutarla. Si no fuera así, puede resaltar con calma laROLLBACK
parte y ejecutarla. Incluso puede usar complementos como SSMS Tools Pack para editar suNew Query
plantilla para incluir esa plantilla.Ahora aún podría meterte en problemas en caso de que ejecutes la consulta y luego no confirmes ni reviertas, porque ahora tu transacción está bloqueando a otros usuarios. Pero esto es mejor que modificar irrevocablemente los datos.
Y, por supuesto, como siempre, tenga una copia de seguridad en la que pueda confiar.
fuente
@ Aaron es correcto. Crear una transacción antes de tus comandos es tu mejor opción. Si no puede recordar hacer eso, entonces una opción es ir a la
Tools-Options
configuración y encenderSET IMPLICIT_TRANSACTIONS
. Esto iniciará automáticamente una transacción tan pronto como se ejecuten ciertos comandos. Esto incluyeUPDATE
,DELETE
etc. Esto parece ser una lista bastante completa de cualquier comando que haría"change"
algo.SELECT
también se incluye en la lista ywill
comienza una transacción. Puede ver una lista completa de los comandos que inician una transacción con esta configuración aquí . No creará una transacción si ya se ha iniciado una. Ahora el lado negativo de esto es que tendrá que recordarCOMMIT
después de cualquier cambio realizado.NOTA: Según la sugerencia de @ Aaron, voy a volver a enfatizar esto.
Básicamente, estás intercambiando el olvido de
BEGIN
una transacción y arruinando algo, por olvidarCOMMIT
una transacción y colgarla si la dejas abierta y luego te vas por el día. Probé simplemente cerrando una ventana de consulta pensando que revertiría mi transacción, sin embargo, me preguntó si quería confirmar o revertir la transacción.fuente
SELECT
se iniciará una transacción (que también se documenta en el enlace informados)Creo que realmente depende:
Si el comando ya llega al servidor antes de desconectar el cable de red, el comando continuará ejecutándose normalmente.
Si tiene un TransactionScope (utilizado en .Net, no estoy seguro de otros idiomas) para encapsular todos los comandos de actualización, probablemente pueda detener la transacción para que se confirme solo si no se ha ejecutado la transacción. .
fuente