Supongamos que tengo una consulta:
begin tran
-- some other sql code
Y luego me olvido de comprometerme o retroceder.
Si otro cliente intenta ejecutar una consulta, ¿qué pasaría?
sql-server
transactions
commit
Charbel
fuente
fuente
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.
fuente
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).
fuente
depende del nivel de aislamiento de la transacción entrante.
Explicación del aislamiento de transacciones SQL
fuente
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.
fuente
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
fuente
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.fuente
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.
fuente
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
Hsqldb hace una reversión
el resultado es
fuente