Respuestas:
Siempre que no COMPRUEBE o RETROCEDA una transacción, todavía está "ejecutándose" y potencialmente manteniendo bloqueos.
Si su cliente (aplicación o usuario) cierra la conexión a la base de datos antes de comprometerse, las transacciones que aún se estén ejecutando se revertirán y finalizarán.
De hecho, puede probar esto usted mismo, eso debería ayudarlo a tener una idea de cómo funciona.
Abra dos ventanas (pestañas) en Management Studio, 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 bloquearse hasta que se confirme la primera ventana, o es posible que (no) vea lo que ha hecho la otra transacción hasta ahora, etc.
Juegue con los diferentes niveles de aislamiento y sin pistas de bloqueo para ver cómo afectan los resultados.
Vea también lo que sucede cuando arroja un error en la transacción.
Es muy importante entender cómo funciona todo esto o te quedarás perplejo por lo que hace sql, muchas veces.
¡Que te diviertas! GJ.
Las transacciones están diseñadas para ejecutarse completamente o no ejecutarse en absoluto. La única forma de completar una transacción es comprometerse, cualquier otra forma resultará en una reversión.
Por lo tanto, si comienza y luego no se compromete, se revertirá al cerrar la conexión (ya que la transacción se interrumpió sin marcar como completa).
depende del nivel de aislamiento de la transacción entrante.
Cuando abre una transacción, nada se bloquea por sí solo. Pero si ejecutas algunas consultas dentro de esa transacción, dependiendo del nivel de aislamiento, algunas filas, tablas o páginas se bloquean por lo que afectará a otras consultas que intentan acceder a ellas desde otras transacciones.
Ejemplo de transacción
comenzar tran tt
Tus declaraciones SQL
si ocurrió un error rollback tran tt else commit tran tt
Mientras no haya ejecutado la transacción de confirmación, los datos no se cambiarán
BEGIN TRAN X ... BEGIN TRAN Y ... ROLLBACK Y
no funciona, por ejemplo. Ver stackoverflow.com/questions/1273376/…
Además de los posibles problemas de bloqueo que puede 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 está utilizando el aislamiento de instantáneas, su almacén de versiones en tempdb crecerá durante razones similares.
Puede utilizar dbcc opentran
para ver los detalles de la transacción abierta más antigua.
Cualquier transacción no iniciada dejará el servidor bloqueado y otras consultas no se ejecutarán en el servidor. Debe revertir la transacción o confirmarla. El cierre de SSMS también terminará la transacción, lo que permitirá que se ejecuten otras consultas.
El comportamiento no está definido, por lo que debe establecer explícitamente una confirmación o una reversión:
http://docs.oracle.com/cd/B10500_01/java.920/a96654/basic.htm#1003303
"Si el modo de confirmación automática está deshabilitado y cierra la conexión sin comprometer o revertir explícitamente sus últimos cambios, entonces se ejecuta una operación COMMIT implícita".
Hsqldb hace una reversión
con.setAutoCommit(false);
stmt.executeUpdate("insert into USER values ('" + insertedUserId + "','Anton','Alaf')");
con.close();
el resultado es
2011-11-14 14: 20: 22,519 principal INFO [SqlAutoCommitExample: 55] [AutoCommit habilitado = falso] 2011-11-14 14: 20: 22,546 principal INFO [SqlAutoCommitExample: 65] [Se encontraron 0 # usuarios en la base de datos]