2012-09-11 18 views
6

estoy llamar a algunas SP en el trabajo y he descubrir que quien escribió el código utiliza una transacción en una sola instrucción de actualización como estoutilizando la transacción en una sola instrucción de actualización

begin transaction 
*single update statment:* update table whatever with whatever 
commit transaction 

entiendo que esto es un error, porque La transacción se usa cuando desea actualizar varias actualizaciones. Quiero entender desde el punto de vista teórico, ¿cuáles son las implicaciones de usar el código como el anterior? ¿Hay alguna diferencia en la actualización de cualquier tabla con y sin la transacción? ¿Hay cerraduras adicionales o algo así?

+1

Es una transacción con una sola declaración. Tal vez el desarrollador original pensó que podrían requerirse declaraciones/acciones adicionales en el futuro. –

Respuesta

5

Tal vez la transacción se incluyó debido al futuro código antes posible o que puede implicar otros datos. ¿Tal vez ese desarrollador simplemente tiene el hábito de envolver el código en las transacciones para estar 'seguro'?

Pero si la declaración implica literalmente solo una única actualización en una sola fila, realmente no hay beneficio de que ese código esté allí en este caso. Una transacción no necesariamente "bloquea" nada, aunque las acciones realizadas dentro de ella pueden, por supuesto. Solo se asegura de que todas las acciones contenidas en él se realicen en todo o en nada.

Tenga en cuenta que una transacción no se trata de varias tablas, sino de múltiples actualizaciones. Asegurar que las actualizaciones múltiples sucedan todo o nada.

Por lo tanto, si estuviera actualizando la misma tabla dos veces, habría una diferencia con o sin la transacción. Pero su ejemplo muestra solo una única declaración de actualización, presumiblemente actualizando solo un registro.

De hecho, es probable que las transacciones encapsulen varias actualizaciones en la misma tabla. Imagine lo siguiente:

INSERT INTO Transactions (AccountNum, Amount) VALUES (1, 200) 
INSERT INTO Transactions (AccountNum, Amount) values (2, -200) 

Esto se debe incluir en una transacción, para garantizar que el dinero se transfiera correctamente. Si uno falla, tanto el otro.

+0

La pregunta es: ¿Hay alguna diferencia entre una sola declaración de actualización con y sin la transacción? – user1662812

+0

@ user1662812 No hace absolutamente nada.Todas las declaraciones individuales ya están envueltas de manera efectiva en una transacción. Sin embargo, no creo que esto cree una transacción externa de envoltura. –

4

Entiendo que esto es incorrecto porque la transacción se usa cuando desea actualizar varias tablas.

No necesariamente. Se trata únicamente de una mesa - y sólo 2 filas:

--- transaction begin 

BEGIN TRANSACTION ; 

UPDATE tableX 
SET Balance = Balance + 100 
WHERE id = 42 ; 

UPDATE tableX 
SET Balance = Balance - 100 
WHERE id = 73 ; 

COMMIT TRANSACTION ; 

--- transaction end 
3

Afortunadamente, el código de su colega se parece más a esto, de lo contrario, SQL emitirá un error de sintaxis. Según el comentario de Ypercube, no hay un propósito real al colocar una declaración dentro de una transacción, pero posiblemente este es un estándar de codificación o similar.

begin transaction -- Increases @@TRANCOUNT to 1 
update table whatever with whatever 
commit transaction -- DECREMENTS @@TRANCOUNT to 0 

A menudo, cuando la emisión de declaraciones ad hoc directamente en SQL, es una buena idea para envolver sus estados de cuenta en una transacción, si acaso que algo va mal y hay que deshacer, es decir

begin transaction -- Just in case my query goofs up 
update table whatever with whatever 
select ... from table ... -- check that the correct updates/deletes/inserts happened 
-- commit transaction -- Only commit if the above check succeeds. 
Cuestiones relacionadas