Esta pregunta ciertamente se aplica a un alcance mucho más amplio, pero aquí está.Forma correcta de generar números de orden en SQL Server
Tengo una aplicación de comercio electrónico básica, donde los usuarios pueden, naturalmente, hacer pedidos. Dichos pedidos deben tener un número único, que estoy tratando de generar en este momento.
Cada pedido es específico del vendedor. Básicamente, tengo una tabla OrderNumberInfo (VendorID, OrderNumber)
. Ahora, cada vez que un cliente realiza un pedido, necesito incrementar OrderNumber
para un Vendedor en particular y devolver ese valor. Naturalmente, no quiero otros procesos para interferir conmigo, así que necesito para bloquear exclusivamente esta fila de alguna manera:
begin tranaction
declare @n int
select @n = OrderNumber
from OrderNumberInfo
where VendorID = @vendorID
update OrderNumberInfo
set OrderNumber = @n + 1
where OrderNumber = @n and VendorID = @vendorID
commit transaction
Ahora, que he leído sobre select ... with (updlock rowlock)
, el bloqueo pesimista, etc., pero simplemente no puede ajustarse todo esto en una imagen coherente:
- ¿Cómo funcionan estas sugerencias con el aislamiento de instantáneas de SQL Server 2008?
- ¿Realizan bloqueos a nivel de fila, nivel de página o incluso nivel de tabla?
- ¿Cómo se tolera esto que varios usuarios intenten generar números para un único proveedor?
- ¿Qué niveles de aislamiento son apropiados aquí?
- Y en general, ¿cuál es la manera de hacer tales cosas?
EDITAR
sólo para hacer más claro algunas cosas:
- rendimiento en este rincón particular de la aplicación no es en absoluto un problema: los pedidos se colocan con poca frecuencia y supondrá una llamada costosa al servicio web de los vendedores, por lo que un retraso de 1 segundo es bastante tolerable
- Nosotros realmente necesitamos tener los números de orden de cada proveedor para b e independiente y secuencial
¡Eso es interesante! ¡Gracias! –
Si la columna OrderNumber representa el último OrderNumber utilizado, ¿no le gustaría Inserted.OrderNumber? – Thomas
@Thomas: Solo estoy imitando el comportamiento del código proporcionado en la pregunta, que primero obtiene el número de pedido y luego incrementa la columna. Pero si desea incrementar y luego obtener el número de orden incrementado, entonces 'INSERTED.OrderNumber' sería la manera de hacerlo. – LukeH