¿alguna funcion similar a las secciones criticas de windows pero en sql?

Iniciado por Filantropo, 16 Abril 2020, 06:22 AM

0 Miembros y 1 Visitante están viendo este tema.

Filantropo

En una tabla de usuarios

tbUsuarios
   nombre
   clave
   email
   telefono

Lo que trato es imitar el comportamiento de la restriccion unique sobre el campo nombre que debe ser unico, en el procedimiento almacenado de insercion lo que hace es comprobar si algun usuario ya tiene el mismo nombre, si aun no entonces lo inserta pero si ya esta en uso NO inserta solo genera un error, tengo este codigo:




Create proc sp_insertar_usuario(in_nombre, in_clave, in_email, in_telefono)
Begin
   'Verificar si ya eziste un usuario con ese nombre
   filas=select count (*) from tbusuario where nombre=in_nombre
   If filas>0
         -- ya existe, generar error y no insertar
   Else
        -- no existe aun, proceder insercion
        insert into tbusuario (nombre,clave,email,telefono)
End




Ahora la duda que tengo es que... sabiendo que una BD puede ser accedida por muchos aplicaciones en simultaneo y ademas que los procesos de aplicacion suelen crear varios hilos de ejecucion se me ocurrio que podria suceder que 2 apps traten de insertar al mismo tiempo usuarios con el mismo nombre y se ejecuta el sp_insertar_usuario 2 veces al mismo tiempo, al llegar al select ambos tienen el mismo resultado : "0"
lo que significa quew el nombre todavia no esta en uso y llegan al if donde procede a realizar ambas inserciones con el mismo nombre, podria ocurrir un caso como este y como se podria evitar?
En windows c++ ocurrian casos como este de acceso simultaneo a uns funcion y se usaba las secciones criticas para impedirlo.

Shell Root

Si crees que es muy posible que se ejecuten al mismo tiempo el script -teniendo en cuenta, horas/minutos/segundo/milisegundos-?
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

ThunderCls

Has intentado usar Transactions/Isolation Levels?, creo que con eso puedes hacer lo que quieres
-[ "...I can only show you the door. You're the one that has to walk through it." – Morpheus (The Matrix) ]-
http://reversec0de.wordpress.com
https://github.com/ThunderCls/

Filantropo

Cita de: ThunderCls en 16 Abril 2020, 17:25 PM
Has intentado usar Transactions/Isolation Levels?, creo que con eso puedes hacer lo que quieres
Gracias.