Digamos que tengo un procedimiento almacenado simple que se parece a esto (nota: esto es sólo un ejemplo, no es un procedimiento práctico):¿La ejecución del procedimiento almacenado de T-SQL es "atómica"?
CREATE PROCEDURE incrementCounter AS
DECLARE @current int
SET @current = (select CounterColumn from MyTable) + 1
UPDATE
MyTable
SET
CounterColumn = current
GO
Estamos asumiendo que tengo una tabla llamada 'myTable' que contiene una fila, con el 'CounterColumn' que contiene nuestro recuento actual.
¿Se puede ejecutar este procedimiento almacenado varias veces, al mismo tiempo?
es decir, es esto posible:
que llamo 'incrementCounter' dos veces. La llamada A llega al punto donde establece la variable 'actual' (digamos que es 5). La llamada B llega al punto donde establece la variable 'actual' (que también sería 5). La llamada A finaliza la ejecución, luego finaliza la llamada B. Al final, la tabla debe contener el valor de 6, pero en su lugar contiene 5 debido a la superposición de la ejecución
Este fenómeno se denomina "actualización perdida". Es el "aislamiento", no la atomicidad, lo que necesita observar. Debajo de leer por defecto el nivel de aislamiento comprometido ** es ** posible en contra de la implicación en la respuesta aceptada. –
Una respuesta práctica a esto en SQL Server 2005 es: Use una tabla con una columna 'IDENTIDAD', inserte en la tabla y luego vuelva a leer el nuevo valor con' SCOPE_IDENTITY'. Entonces nunca tienes una colisión. –