Hay muchas preguntas sobre CÓMO usar Transacciones. Lo que quiero saber es CUANDO? ¿Bajo que circunstancias? ¿Qué tipos de consultas? ¿Pueden los bloques Try-Catch ser suficientes en su lugar? Etc ...Cuándo usar Transacciones en SQL Server
He diseñado una base de datos con ~ 20 tablas y ~ 20 procedimientos almacenados. Actualmente, ninguno de mis SP usa una transacción, pero hay numerosos bloques Try-Catch en todo momento. La razón es porque cada vez que traté de envolverlos en una transacción, el SP dejaba de funcionar y yo terminaba con datos faltantes y peores que si hubiera usado Trans.
Así que de nuevo ...
- Cuando es el momento apropiado para utilizar una transacción?
- Como una pregunta de seguimiento, si los utilizo, ¿cómo puedo usarlos de manera que SOLO evite que otros SP accedan a los mismos datos al mismo tiempo para evitar daños en lugar de causar mis SP? para no funcionar en absoluto?
He aquí una pequeña muestra de SP que escribí para cambiar el nombre de un producto:
CREATE PROCEDURE spRenameProduct
@pKey int = NULL,
@pName varchar(50)
AS
BEGIN
BEGIN TRY
IF LTRIM(RTRIM(@pName)) = '' SET @pName = NULL
IF NOT @pKey IS NULL AND NOT @pName IS NULL BEGIN
declare @pKeyExisting int = (select MIN(ID) from rProduct where Product like @pName and not ID = @pKey)
IF @pKeyExisting is null BEGIN
update rProduct set IsValid = 1, Product = @pName where ID = @pKey
END ELSE BEGIN
update Request set ProductID = @pKeyExisting where ProductID = @pKey
update StatusReport set ProductID = @pKeyExisting where ProductID = @pKey
delete from rProduct where ID = @pKey
END
END
END TRY BEGIN CATCH END CATCH
END
Ahora lo que si dos personas estaban usando esto en el mismo momento? Realmente no quiero, ni tengo tiempo (por desgracia), para llegar a ser elegante. BESO. es mejor en este caso. :)
Está mezclando el nivel de aislamiento con la transacción. Con el aislamiento, puede bloquear otras actualizaciones por la duración de esa declaración única. Si necesita un conjunto de actualizaciones para suceed o fail como conjunto, las envuelve en una transacción. Si desea que las dos actualizaciones y una eliminación permanezcan sincronizadas, eso es lo que puede hacer una transacción. – Paparazzi
@BalamBalam Entonces, en otras palabras, puede ser lógico ajustar solo las dos actualizaciones y una eliminación en una transacción, pero siempre solo envolviendo SP completos no tiene mucho sentido, supongo. Aun así, creo que las trans a veces pueden ser demasiado engorrosas para trabajar porque los desarrolladores a veces cometen errores. No me gustaría que la aplicación falle solo por una excepción inofensiva como referencia nula o algo así. ¿Alguna palabra de sabiduría? Todavía nuevo en esto :) – Chiramisu
No sé cómo decirlo de forma más clara. Si necesita que el conjunto falle o que tenga éxito como un todo, envuélvalo en una transacción. El ejemplo clásico es la transferencia de dinero de una cuenta de cheques a una de ahorro: si el depósito falla, entonces quiero que la retirada falle. Si los datos no están sincronizados debido a un error del desarrollador está bien, entonces no use transacciones. – Paparazzi