transaction salida procedimientos procedimiento parametros niveles entrada ejemplos ejemplo ejecutar con begin almacenados almacenado aislamiento sql-server stored-procedures transactions transaction-isolation

sql-server - salida - procedimiento almacenado java sql server



¿Está bien si desde dentro de un procedimiento almacenado llamo a otro que establece un nivel de aislamiento de transacción inferior? (1)

Todo está aquí para SQL Server 2005. Un fragmento:

Cuando cambia una transacción de un nivel de aislamiento a otro, los recursos que se leen después del cambio están protegidos de acuerdo con las reglas del nuevo nivel. Los recursos que se leen antes del cambio continúan protegidos de acuerdo con las reglas del nivel anterior. Por ejemplo, si una transacción cambió de READ COMMITTED a SERIALIZABLE, los bloqueos compartidos adquiridos después del cambio ahora se mantienen hasta el final de la transacción.

Si emite SET TRANSACTION ISOLATION LEVEL en un procedimiento almacenado o disparador, cuando el objeto devuelve el control, el nivel de aislamiento se restablece al nivel vigente cuando se invoca el objeto. Por ejemplo, si configura REPEATABLE READ en un lote y el lote llama a un procedimiento almacenado que establece el nivel de aislamiento en SERIALIZABLE, la configuración del nivel de aislamiento vuelve a REPEATABLE READ cuando el procedimiento almacenado devuelve el control al lote.

En este ejemplo:

  • Cada nivel de aislamiento se aplica para el alcance del proceso almacenado
  • Recursos bloqueados por DoSomethingImportante permanecer en SERIALIZABLE
  • Los recursos utilizados por CheckSomething son LEÍDO SIN COMPROMISO

Tengo un conjunto de procedimientos de utilidad que solo verifican algunas condiciones en la base de datos y devuelven un resultado de bandera. Estos procedimientos se ejecutan con el nivel de aislamiento READ UNCOMMITTED, equivalente a WITH NOLOCK.

También tengo procedimientos más complejos que se ejecutan con nivel de aislamiento SERIALIZABLE. También tienen estos mismos tipos de controles en ellos.

Así que decidí llamar a estos procedimientos de verificación desde esos complejos procedimientos en lugar de replicar el código de verificación.

Básicamente se ve así:

CREATE PROCEDURE [dbo].[CheckSomething] AS SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED BEGIN TRANSACTION -- Do checks COMMIT TRANSACTION

y

CREATE PROCEDURE [dbo].[DoSomethingImportant] AS SET TRANSACTION ISOLATION LEVEL SERIALIZABLE BEGIN TRANSACTION EXECUTE [dbo].[CheckSomething] -- Do some work COMMIT TRANSACTION

¿Estaría bien hacer eso? ¿El nivel de aislamiento inferior activado temporalmente activará de algún modo la protección de nivel superior o todo será perfecto?

EDITAR: la ejecución transcurre sin errores.