Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Obener Id del row actualizado con un update anidado

Estas en el tema de Obener Id del row actualizado con un update anidado en el foro de SQL Server en Foros del Web. Hola chicos, Espero me puedan ayudar con mi problema, tengo dos tablas una tabla_ordenes donde guardo ordenes de cliente y detalles fijos y otra tabla ...
  #1 (permalink)  
Antiguo 24/07/2012, 09:02
Avatar de aaudom  
Fecha de Ingreso: febrero-2012
Ubicación: Chihuahua
Mensajes: 23
Antigüedad: 12 años, 9 meses
Puntos: 0
Obener Id del row actualizado con un update anidado

Hola chicos,

Espero me puedan ayudar con mi problema, tengo dos tablas una tabla_ordenes donde guardo ordenes de cliente y detalles fijos y otra tabla de identificadores, en la cual guardo los numeros de serie asociados a determinada orden de cliente.

Mi problema es el siguente, tengo varios equipos que solicitan un identificador de determinada orden casi de manera simultanea, por lo que la tabla identificadores tiene una columna status, que muestra si esta disponible el identificador o no, pero para actualizar este campo a veces tarda y les da el mismo identificador a varios equipos, para solucionarlo intente hacer un update anidado pero no se como obtener el valor de el campo que actualice, algo asi quiero hacer:

update SY_SerialsDetails set Status_ID=2
where CounterDetails_ID= @id=select top 1 CounterDetails_ID from SY_SerialsDetails a
inner join CT_OrdersReserve b on a.CounterOrder_ID=b.CounterOrder_ID
where POOrder='12345-1' and a.Status_ID=1

Claro que este no funciona, me podrian ayudar?

Gacias de antemano

Saludos

Ana
  #2 (permalink)  
Antiguo 24/07/2012, 09:37
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Obener Id del row actualizado con un update anidado

y porque no revisas las opciones de sql server para la concurrencia de datos? para bloquear los registros mientras estan siendo vistos por otros usuarios?
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 24/07/2012, 09:40
Avatar de aaudom  
Fecha de Ingreso: febrero-2012
Ubicación: Chihuahua
Mensajes: 23
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: Obener Id del row actualizado con un update anidado

Pero eso no me bloqueara la tabla? lo que quiero es solo bloquear un solo registro, pero que pueda tomar el siguiente consecutivo
  #4 (permalink)  
Antiguo 24/07/2012, 09:57
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Obener Id del row actualizado con un update anidado

te bloquearia el registro que se esta leyendo en ese momento no toda la tabla

http://www.gavindraper.co.uk/2012/02...ls-by-example/

si quieres obtener el campo que se actualizo usa un trigger after update y te quitas de broncas :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 24/07/2012, 10:56
Avatar de aaudom  
Fecha de Ingreso: febrero-2012
Ubicación: Chihuahua
Mensajes: 23
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: Obener Id del row actualizado con un update anidado

Gracias Libras, no soy experta el SQL y soy relativamente nueva en eso y con un dia no creo que pueda comprender el funcionamiento de todo esto(triggers bloqueos jaja), perdon si mis preguntas son un tanto novatas..

Actualmente tengo un SP que hace un select para obtener el id del numero disponible, con ese id hago el update de status y luego devuelvo el numero que elegi y se lo paso al equipo, el despues procesa ese serial..

ESto no me esta funcionando porque el SP tarda mas en ejectuar el select y luego el update y cuando ya lo hace, ya varios equipos tiene el serial..

Entonces segun lo que lei, puedo bloquear el registro, solo que no me queda claro que tanto abarca, por ejemplo esta sentencia

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

si tengo mi query actual dentro de esta sentencia hasta que termine el select y luego el update libera el registro?? y las otras solicitudes simplemente no van a poder ver el registro pero si podran ver los otros registros disponibles.. no van a esperar a que se libere este registro para continuar??

Gracias y disculpa una vez mas mi preguntas novatas
  #6 (permalink)  
Antiguo 24/07/2012, 11:23
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Obener Id del row actualizado con un update anidado

en cuanto a tu pregunta asi es, mientras el registro este siendo usado por otra persona no podria ser visto por los demas(siempre y cuando se manejen transaccioens) esto es por ejemplo para un update:
begin tran test
update table set valor=1 where id=1
commit tran tes

hasta que el update termine de actualizar sus valores entonces el registro con el id 1 sera visible para los demas :)

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 24/07/2012, 13:13
Avatar de aaudom  
Fecha de Ingreso: febrero-2012
Ubicación: Chihuahua
Mensajes: 23
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: Obener Id del row actualizado con un update anidado

Hola Libras gracias nuevamente x tu respuesta...

Ahorita implemente lo siguente pero no funciono estoy haciendo algo mal?

Es un SP

tengo un select count que alimenta la variable @count

IF @count>0
BEGIN
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

begin transaction

aqui hace el select del ID (quiero que bloqueee este registro con el select)
y despues de esto hace el update


COMMIT TRANSACTION

END
end
  #8 (permalink)  
Antiguo 24/07/2012, 13:18
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Obener Id del row actualizado con un update anidado

que no funciona?
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #9 (permalink)  
Antiguo 24/07/2012, 13:20
Avatar de aaudom  
Fecha de Ingreso: febrero-2012
Ubicación: Chihuahua
Mensajes: 23
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: Obener Id del row actualizado con un update anidado

No hace ningun bloqueo, sigue dandome para varias solicitudes el mismo serial x que no bloquea en el select :(
  #10 (permalink)  
Antiguo 24/07/2012, 13:21
Avatar de aaudom  
Fecha de Ingreso: febrero-2012
Ubicación: Chihuahua
Mensajes: 23
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: Obener Id del row actualizado con un update anidado

Cita:
Iniciado por aaudom Ver Mensaje
No hace ningun bloqueo, sigue dandome para varias solicitudes el mismo serial x que no bloquea en el select :(

Refiriendome al select que esta dentro del SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
  #11 (permalink)  
Antiguo 24/07/2012, 13:33
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Obener Id del row actualizado con un update anidado

el bloqueo no lo hace con un select....el bloqueo se hace con el update, si haces esto:

Código SQL:
Ver original
  1. CREATE TABLE TestDeadLock(
  2. id INT,
  3. name VARCHAR(20)
  4. )
  5.  
  6. INSERT INTO TestDeadLock VALUES (1,'Madhu')
  7. INSERT INTO TestDeadLock VALUES (2,'Madhu')
  8. INSERT INTO TestDeadLock VALUES (3,'Madhu')
  9.  
  10. SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
  11. BEGIN tran
  12. UPDATE TestDeadLock
  13. SET name='Libras'
  14. WHERE id=3

Luego abres otra sesion de sql manager o ejecutas este query en otra ventana veras el bloqueo

select * from dbo.TestDeadLock

ya que este select no regresa valores hasta que des el commit tran en el ejemplo anterior, un bloqueo no se hace por un select se hace por un update, insert o delete :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #12 (permalink)  
Antiguo 24/07/2012, 13:48
Avatar de aaudom  
Fecha de Ingreso: febrero-2012
Ubicación: Chihuahua
Mensajes: 23
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: Obener Id del row actualizado con un update anidado

Gracias Libras... eso me ha ayudado a entender, entonces el problema lo tengo precisamente al hacer el select.. no en el update...

Se podria hacer el update y obener al mismo tiempo el id del select?

Es decir existe alguna forma en la que pueda obtener el id del update que estoy haciendo al mismo tiempo que el update...algo como lo siguiente?

update SY_SerialsDetails set Status_ID=2
where CounterDetails_ID= @id=select top 1 CounterDetails_ID from SY_SerialsDetails a
inner join CT_OrdersReserve b on a.CounterOrder_ID=b.CounterOrder_ID
where POOrder='12345-1' and a.Status_ID=1

Gracias nuevamente
  #13 (permalink)  
Antiguo 24/07/2012, 14:38
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Obener Id del row actualizado con un update anidado

Asi no funciona??

update SY_SerialsDetails set Status_ID=2
where CounterDetails_ID=(select top 1 CounterDetails_ID from SY_SerialsDetails a
inner join CT_OrdersReserve b on a.CounterOrder_ID=b.CounterOrder_ID
where POOrder='12345-1' and a.Status_ID=1)

y para sacar el registro que se esta actualizando puedes usar triggers.......

ahora despues de todo este rollo aun no entiendo que quieres hacer :S si el problema es que da el mismo identificador, con el isolation level lo solucionas.....
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #14 (permalink)  
Antiguo 24/07/2012, 14:55
Avatar de aaudom  
Fecha de Ingreso: febrero-2012
Ubicación: Chihuahua
Mensajes: 23
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: Obener Id del row actualizado con un update anidado

Lo que pasa es que necesito saber el id del serial que le actualice el status y de esa manera no puedo :(


Lo que intento hacer es consultar la tabla serialsDetails por medio de 6 equipos pero quiero que cada vez que la consulte un equipo le de un id diferente, para eso estoy actualizando el estatus, para ponerlo en uso y que ya no lo vuelva a dar, pero en el lapsus que consulto el numero siguiente disponible y hago el update del estatus.. ya varios equipos consultaron el mismo numero.. En verdad no se como es la mejor manera de resolver esto :(
  #15 (permalink)  
Antiguo 24/07/2012, 15:24
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Obener Id del row actualizado con un update anidado

hice esta prueba

Código SQL:
Ver original
  1. CREATE TABLE TestDeadLock(
  2. id INT,
  3. name VARCHAR(20),
  4. STATUS bit
  5. )
  6.  
  7. INSERT INTO TestDeadLock VALUES (1,'uno',0)
  8. INSERT INTO TestDeadLock VALUES (2,'dos',0)
  9. INSERT INTO TestDeadLock VALUES (3,'tres',0)
  10.  
  11. DECLARE @id INT
  12.  
  13. SELECT top 1 @id=id FROM TestDeadLock WHERE STATUS=0 ORDER BY id
  14.  
  15. print @id
  16.  
  17. SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
  18. BEGIN tran
  19. UPDATE TestDeadLock
  20. SET STATUS=1
  21. WHERE id=@id
  22. commit tran

y en otra ventana:

select top 1 id,name from TestDeadLock where status=0 order by id

y el resultado del segundo select fue el 2 porque el uno se estaba actualizando asi que al siguiente usuario le daria un 2 al siguiente un 3 y asi sucesivamente, de esta forma no te sirve??
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #16 (permalink)  
Antiguo 25/07/2012, 09:40
Avatar de aaudom  
Fecha de Ingreso: febrero-2012
Ubicación: Chihuahua
Mensajes: 23
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: Obener Id del row actualizado con un update anidado

Una vez mas Libras muchas gracias por tu apoyo :)

Esa logica es la que tengo actualmente, pero no me ha funcionado, al parecer varios equipos toman el ID antes de que uno lo actualice, la actualizacion final la hace solo uno pero al final ya varios tomaron el ID :(

Esta muy curioso x que me parece casi improbable que sea todo al mismo tiempo pero aun asi sucede, que mas podra ser?

Gracias nuevamente Libras :)
  #17 (permalink)  
Antiguo 25/07/2012, 11:03
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Obener Id del row actualizado con un update anidado

y si primero actualizas, y luego seleccionas ese que tiene el 1 y es el que regresas?? asi si 2 entran al mismo tiempo le dara 2 id's diferentes no?
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #18 (permalink)  
Antiguo 25/07/2012, 11:05
Avatar de aaudom  
Fecha de Ingreso: febrero-2012
Ubicación: Chihuahua
Mensajes: 23
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: Obener Id del row actualizado con un update anidado

me parece buena esa idea, pero aun no encuentro la manera de saber cual fue el id que actualice :(
  #19 (permalink)  
Antiguo 25/07/2012, 11:16
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Obener Id del row actualizado con un update anidado

el que tenga el 1??? si haces un trigger obtienes ese id....
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #20 (permalink)  
Antiguo 26/07/2012, 12:01
Avatar de aaudom  
Fecha de Ingreso: febrero-2012
Ubicación: Chihuahua
Mensajes: 23
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: Obener Id del row actualizado con un update anidado

Creo que causaria el mismo problema puesto que tendria que hacer un select top 1 * from mitabla where status=1, separado del update

si lo hacen varios equipos simultaneos habra varios ids con status 1 y tomaria el primero entonces es lo mismo


No existe manera de obtener el id simultaneo desde el update??

si es con un trigger como devuelve el valor ami procedimiento.. estoy hecha un nudo :(
  #21 (permalink)  
Antiguo 26/07/2012, 12:25
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Obener Id del row actualizado con un update anidado

puedes hacer un insert a una tabla "temporal" dentro del trigger con el id que estas manejando.....
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #22 (permalink)  
Antiguo 26/07/2012, 20:12
Avatar de aaudom  
Fecha de Ingreso: febrero-2012
Ubicación: Chihuahua
Mensajes: 23
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: Obener Id del row actualizado con un update anidado

Hola Libras, pues molestandote otra vez..

Hice lo siguiente, creé una tabla temporal a la cual le agregué un trigger after insert, es decir en cuanto se inserte un registro hace una actualizacion en el status de la otra tabla..

hasta ahí todo bien, cambié mi store procedure para que en lugar de hacer primero el select hiciera lo siguiente:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
begin transaction myTrans

INSERT INTO TMP_SerialsReserved
SELECT TOP 1 Serial FROM SY_SerialsDetails (nolock)
WHERE POOrder='123456-001'
AND Status_ID=1
ORDER BY CounterDetails_ID ASC

COMMIT TRANSACTION myTrans

Asi, me insertará en la tabla temporal, se lanzará el trigger y me devolviera con un @@IDENTITY el id del registro que inserto.

puse dos SQL Managment y corri simultaneamente la insercion, resulta que aun asi me sigue dando el mismo para dos solicitudes diferentes.. :(



Crees que estoy haciendo algo mal?? que sucede x que aun asi no funciona...
  #23 (permalink)  
Antiguo 27/07/2012, 08:32
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Obener Id del row actualizado con un update anidado

y tu update como quedo? podrias poner el codigo? como lo corres en 2 ventanas al mismo tiempo? porque yo solito no he podido hacer eso :S
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #24 (permalink)  
Antiguo 27/07/2012, 08:52
Avatar de aaudom  
Fecha de Ingreso: febrero-2012
Ubicación: Chihuahua
Mensajes: 23
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: Obener Id del row actualizado con un update anidado

Asi quedo mi update en el trigger:

update SY_SerialsDetails set Status_ID=2, LastUpdated=GETDATE()
where CounterDetails_ID = (SELECT CounterDetails_ID
FROM INSERTED)

para correr simultaneamente hice una función en VS que mandara llamar el SP para que insertara en la tabla temporal (1000 veces) y luego en los sql managment puse algunos insert asi seguidos y en uno le di execute y la otra ventana tenia otros cuatro queries de insert y le F5 muchas veces jaja.. se que se oye extremo pero necesito descartar los duplicados 100%

:S como vez??
  #25 (permalink)  
Antiguo 27/07/2012, 09:13
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Obener Id del row actualizado con un update anidado

y en el update donde esta el

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE y estas segura que con ese isolation level logras lo que necesitas??
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #26 (permalink)  
Antiguo 27/07/2012, 10:17
Avatar de aaudom  
Fecha de Ingreso: febrero-2012
Ubicación: Chihuahua
Mensajes: 23
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: Obener Id del row actualizado con un update anidado

ou!!... no lo tengo en el update, dejame lo pongo y vuelvo a hacer pruebas..
  #27 (permalink)  
Antiguo 27/07/2012, 11:21
Avatar de aaudom  
Fecha de Ingreso: febrero-2012
Ubicación: Chihuahua
Mensajes: 23
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: Obener Id del row actualizado con un update anidado

Hola Nuevamente Libras, ya le agregué la linea al update, hice la misma prueba de estres y si disminuyo, aunque no se evito.. de 3700 silicitudes en tres minutos fueron dos duplicados.. Lo acabo de implementar en el proceso natural jaja y al parecer ahi con 6 equipos no se les ha duplicado, creo que se cumple el objetivo..

Te agradezco mucho tu ayuda, gracias x la asesoria y la compañia en mi problema, en verdad me fuiste de mucha ayuda con tu guia jeje.. de verdad que no conocia nada de triggers ni de concurrencia de datos.

Mil gracias :)
  #28 (permalink)  
Antiguo 27/07/2012, 11:34
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Obener Id del row actualizado con un update anidado

eso es un buen VOC :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Etiquetas: update, anidados
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:58.