una transacciones transaccion gestion ejemplos deshacer como comandos cerrar anidadas sql sql-server select transactions

gestion - transacciones en sql server pdf



¿Hay alguna diferencia entre una declaración seleccionada dentro de una transacción y una que está fuera de ella? (4)

¿El nivel de aislamiento READ COMMITTED predeterminado de alguna manera hace que la instrucción select actúe diferente dentro de una transacción que una que no está en una transacción?

Estoy usando MSSQL.


El nivel de aislamiento READ COMMITTED se trata de los registros que se han escrito. No tiene nada que ver con si esta declaración seleccionada está o no en una transacción (a excepción de las cosas escritas durante esa misma transacción).


Sí, hay un poco de diferencia. Para MySQL, la base de datos en realidad no comienza con una instantánea hasta su primera consulta. Por lo tanto, no es lo que realmente importa, sino la primera declaración dentro de la transacción. Si hago lo siguiente:

#Session 1 begin; select * from table; #Session 2 delete * from table; #implicit autocommit #Session 1 select * from table;

Luego obtendré lo mismo en la sesión uno ambas veces (la información que estaba en la tabla antes de eliminarla). Cuando finalizo la transacción de la una (commit, begin, o rollback) y vuelvo a verificar desde esa sesión, la tabla se mostrará como vacía.


Si su base de datos (o en mysql, el motor de almacenamiento subyacente de todas las tablas utilizadas en su declaración de selección) es transaccional, entonces simplemente no hay forma de ejecutarla "fuera de una transacción".

Quizás quise decir "ejecutarlo en modo de confirmación automática", pero eso no es lo mismo que "no transaccional". En este último caso, todavía se ejecuta en una transacción, es solo que la transacción finaliza inmediatamente después de que su estado finaliza.

Por lo tanto, en ambos casos, durante la ejecución, se aislará una única declaración de selección en el nivel LECTURA COMPROMETIDA de las otras transacciones.

Ahora, ¿qué significa esto para su nivel de aislamiento de transacción LEÍDO COMPROMETIDO?: Quizás sorprendentemente, no tanto.

LECTAR COMPROMETIDO significa que puede encontrar lecturas no repetibles: al ejecutar múltiples sentencias de selección en la misma transacción, es posible que las filas que seleccionó en un momento determinado se modifiquen y comience por otra transacción. Podrá ver esos cambios cuando vuelva a ejecutar la declaración de selección más adelante en la misma transacción pendiente. En el modo de confirmación automática, esas 2 declaraciones seleccionadas se ejecutarán en su propia transacción. Si otra transacción hubiera modificado y comprometido las filas que seleccionó la primera vez, también podría ver esos cambios cuando haya ejecutado la declaración por segunda vez.


sí, el que está dentro de la transacción puede ver los cambios realizados por otras instrucciones Insert / Update / Delete previas en esa transacción, una declaración Select fuera de la transacción no puede ...

Si todo lo que pregunta es qué hace el Nivel de aislamiento, entienda que todas las declaraciones seleccionadas (por ejemplo, todas las declaraciones de cualquier tipo), - están en una transacción. La única diferencia entre uno que está explícitamente en una transacción y uno que está parado por sí mismo es que el que está solo inicia su transacción inmediatamente antes de ejecutarlo, y confirma o retrotrae inmediatamente después de que se ejecuta,

mientras que el que está explícitamente en una transacción puede (debido a que tiene una instrucción Begin Transaction) tener otras declaraciones (inserts / updates / deletes, whatever) que ocurran dentro de esa misma transacción, ya sea antes o después de esa declaración Select.

Entonces cualquiera que sea el nivel de aislamiento configurado, ambos selecciones (dentro o fuera de una transacción explícita) estarán en una transacción que opere en ese nivel de aislamiento.

Además : lo siguiente es para SQL Server, pero todas las bases de datos DEBEN funcionar de la misma manera. En SQL Server, el procesador de consultas está siempre en uno de los 3 modos de transacción, Autocommit , implícito o explícito .

AutoCommit es el modo de gestión de transacciones predeterminado del Motor de base de datos de SQL Server. .. Cada declaración de Transact-SQL se compromete o se retrotrae cuando se completa. ... Si una declaración se completa con éxito, está confirmada; si encuentra algún error, se revierte. Este es el valor predeterminado, y es la respuesta a la pregunta de @ Alex en los comentarios.

en el modo de transacción implícita , "... el motor de base de datos de SQL Server inicia automáticamente una nueva transacción después de que la transacción actual se confirma o revierte . No hace nada para delinear el inicio de una transacción, solo compromete o retrotrae cada transacción. el modo de transacción genera una cadena de transacciones continua ... ". Tenga en cuenta que el fragmento en cursiva es para cada transacción, ya sea una transacción de extracto único o múltiple.

El motor se coloca en modo de Transacción explícita cuando inicia explícitamente una transacción con la BEGIN TRANSACTION . Entonces, cada instrucción se ejecuta dentro de esa transacción hasta que finalice explícitamente la transacción (con COMMIT o ROLLBACK ) o si ocurre una falla que causa que el motor finalice y Rollback.