2011-02-04 10 views

Respuesta

95

Siempre y cuando no COMMIT o ROLLBACK una transacción, todavía está "en marcha" y potencialmente contienen bloqueos.

Si su cliente (aplicación o usuario) cierra la conexión de la base de datos, cualquier transacción que se esté ejecutando se retrotraerá y finalizará.

+1

mmm, ok Me doy cuenta de que esto estaba creando algún tipo de bloqueo. No estaba seguro de que cerrar la conexión realmente me sacara de este estado. el problema era que estaba recibiendo un error cuando intento comprometerme. ahora cerré la conexión y todo funcionó. – Charbel

+9

Nota al margen: si se utiliza Management Studio, al cerrar la ventana de consulta se cerrará la conexión –

+0

¿Reiniciar el servidor (fuera de una pérdida de alimentación eléctrica) también provocaría una reversión? – BradleyDotNET

2

depende del nivel de aislamiento de la transacción entrante.

Sql transaction isolation explained

+2

El comportamiento de las transacciones no depende del nivel de aislamiento. La cantidad de bloqueos que pueden causar sí lo hace. –

+0

Estoy bastante seguro de que los datos que una conexión puede leer dependen definitivamente del nivel de aislamiento. Si tiene el conjunto de aislamiento para LEER SIN COMPROMISO, puede leer los datos que aún no se han confirmado y, de hecho, pueden retroceder en algún punto de la pista, pero esto garantiza que no haya bloqueo. Si ha LEÍDO COMPROMETIDO como su nivel de aislamiento, entonces no puede leer filas no confirmadas: el segundo cliente se bloqueará a menos que use SNAPSHOT. – Xhalent

9

transacciones están destinadas a funcionar por completo o en absoluto. La única forma de completar una transacción es confirmar, de cualquier otro modo se producirá una reversión.

Por lo tanto, si comienza y luego no confirma, se revertirá al cerrar la conexión (ya que la transacción se interrumpió sin marcar como completa).

1

Cuando abre una transacción, nada se bloquea por sí mismo. Pero si ejecuta algunas consultas dentro de esa transacción, dependiendo del nivel de aislamiento, algunas filas, tablas o páginas se bloquean, por lo que afectará otras consultas que intenten acceder a ellas desde otras transacciones.

24

De hecho, puede intentarlo usted mismo, que debería ayudarlo a tener una idea de cómo funciona esto.

Abra dos ventanas (pestañas) en el estudio de administración, cada una de ellas tendrá su propia conexión a sql.

Ahora puede comenzar una transacción en una ventana, hacer algunas cosas como insertar/actualizar/eliminar, pero aún no confirmar. luego en la otra ventana puede ver cómo se ve la base de datos desde fuera de la transacción. Dependiendo del nivel de aislamiento, la tabla puede estar bloqueada hasta que se confirme la primera ventana, o puede (no) ver lo que la otra transacción ha hecho hasta el momento, etc.

Juega con los diferentes niveles de aislamiento y sin bloqueo sugerencia para ver cómo afectan los resultados.

También vea qué sucede cuando se produce un error en la transacción.

Es muy importante entender cómo funciona todo esto o te sorprenderá lo que hace sql, muchas veces.

¡Diviértete! GJ.

0

Además de los posibles problemas de bloqueo que podría causar, también encontrará que sus registros de transacciones comienzan a crecer ya que no se pueden truncar más allá del LSN mínimo para una transacción activa y si usa aislamiento de instantáneas su tienda de versiones tempdb crecerá por razones similares.

Puede usar dbcc opentran para ver los detalles de la transacción abierta más antigua.

-4

El comportamiento no está definido, por lo que debe conjunto explícito de una confirmación o una retrotracción:

http://docs.oracle.com/cd/B10500_01/java.920/a96654/basic.htm#1003303

"Si modo auto-commit está desactivado y cerrar la conexión sin confirmar o deshacer explícitamente respalda tus últimos cambios, luego se ejecuta una operación de COMPROMISO implícito ".

hsqldb hace una operación de deshacer

con.setAutoCommit(false); 
stmt.executeUpdate("insert into USER values ('" + insertedUserId + "','Anton','Alaf')"); 
con.close(); 

resultado es

2011-11-14 14: 20: 22 519 principal INFO [SqlAutoCommitExample: 55] [activar AutoCommit = false] 2011 -11-14 14: 20: 22,546 main INFO [SqlAutoCommitExample: 65] [Se han encontrado 0 # usuarios en la base de datos]

+2

Esto puede ser cierto para Oracle (no tengo ni idea), pero el cuestionario pregunta por MS-SQL – PaulG

+0

La primera cita se aplica al controlador JDBC, no al servidor. – djechlin

1

Ejemplo de Transacción

comience tran tt

las sentencias SQL

si se ha producido el error rollback tran tt demás commit tran tt

Mientras usted no ha ejecutado commit tran tt, los datos no se cambiarán

+1

Tenga en cuenta que el nombramiento de transacciones no solo es innecesario en MS SQL, sino que también puede dar una falsa sensación de control. 'BEGIN TRAN X ... BEGIN TRAN Y ... ROLLBACK Y' no funciona, por ejemplo. Ver http://stackoverflow.com/questions/1273376/sql-server-2005-why-name-transactions –

0

Cualquier transacción sin procesar dejará la se rver bloqueado y otras consultas no se ejecutarán en el servidor. O necesita deshacer la transacción o comprometerla. El cierre de SSMS también dará por terminada la transacción, lo que permitirá que se ejecuten otras consultas.

Cuestiones relacionadas