¿Puede una declaración de "eliminar" SQL seguida de una declaración "donde no está" estar en la misma transacción?

StackOverflow https://stackoverflow.com/questions/5858685

Pregunta

Si tengo el siguiente bloque SQL (en SQL Server 2008 R2):

BEGIN
    BEGIN TRAN

    DELETE FROM dbo.fooData
    WHERE LastUpdate < DateAdd(hour, -1,GETUTCDATE())

    COMMIT

    BEGIN TRAN

    DELETE FROM dbo.barData
    WHERE SessionID NOT IN (SELECT sub.SessionId FROM dbo.fooData sub)

    COMMIT
    RETURN 0
END

Supongo que tengo que hacer una confirmación explícita entre las declaraciones para que los datos eliminados de Foodata aparezcan en el segundo eliminación. ¿Es esto correcto? Idealmente, me gustaría que todo esto esté en una transacción. Ejemplo:

BEGIN
    BEGIN TRAN

    DELETE FROM dbo.fooData
    WHERE LastUpdate < DateAdd(hour, -1,GETUTCDATE())

    DELETE FROM dbo.barData
    WHERE SessionID NOT IN (SELECT sub.SessionId FROM dbo.fooData sub)

    COMMIT
    RETURN 0
END

Mi temor es que la segunda declaración no recogerá los datos eliminados de la primera. Tenga en cuenta que el retorno está ahí porque esto es parte de un procedimiento almacenado. No me interesa en cascada de eliminación o unión, estoy algo limitado a este método.

¿Fue útil?

Solución

La misma transacción/sesión puede ver que es propio cambios. Otras sesiones no verán estas transacciones no comprometidas de este sesión

Entonces su segunda forma (una transacción más amplia) es seguro usar.

Otros consejos

Puede usar el segundo ejemplo.

Debido a que está en la misma transacción, está accediendo a la información de las operaciones anteriores.

El aislamiento dice que Otras operaciones no pueden acceder a los datos que se han modificado durante una transacción que aún no se ha completado. La cuestión del aislamiento ocurre en caso de transacciones concurrentes (transacciones múltiples que ocurren al mismo tiempo). Pero usted tiene la misma transacción, de modo que la transacción puede y accederá al resultado de la primera operación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top