SQL - sql no reconoce datos previamente grabados en un registro

 
Vista:

sql no reconoce datos previamente grabados en un registro

Publicado por juan manuel ortiz (2 intervenciones) el 06/08/2018 20:08:17
El caso es que tengo una base de datos, en la que todos los procesos de añadir, editar y eliminar se hacen mediante procedimientos almacenados.

en una tabla se controlan los procesos que los usuarios van realizando, cada proceso solo puede ser realizado por un usuario, cuando el usuario lo ha finalizado, se edita el registro de procesos para marcarlo como realizado y luego se genera en otro registro en la tabla que controla el trabajo realizado por cada usuario.

El problema es el siguiente, a veces, pese a que un usuario ha marcado un proceso como realizado, la bd permite a otro usuario volver a marcarlo como realizado, generándose 2 registros de trabajo realizado sobre el mismo proceso.

Por que pienso que el problema es en la base de datos, pues porque el procedimiento que controla la edicion de la tabla de procesos, antes de editar comprueba que no se ha modificado el valor del campo procesado, y comprueba tambien que en la tabla de trabajos no exista un trabajo para ese id_proceso, y aun asi, ocurre en situaciones puntuales que pese a esos dos controles, el procedimiento almacenado se ejecuta ignorando que el campo se modifico previamente e ignorando que ya existe un registro previo en la tabla de trabajos realizados ...

alguna idea de porque ocurre esto ??

siempre me ha ocurrido en sql server 2008, hace poco probe en un sql server 2012, en una de las oficinas que usan el sistema, y también ocurre puntualmente, siempre en momentos en que hay bastantes usuarios conectados al mismo tiempo

si alguien tiene alguna idea/explicacion le estaria eternamente agradecido
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 182
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

sql no reconoce datos previamente grabados en un registro

Publicado por Leonardo Josué (1172 intervenciones) el 06/08/2018 20:20:36
Hola Juan Manuel:

En mi experiencia, cuando se piensa que el problema es la base de datos, el 90 % de las veces (o más) en realidad es problema es del usuario... y en este caso creo que pasa lo mismo...

¿Estás manejando transacciones para tus procesos? si no es así, entonces ahí tienes un problema, ya que estás hablando de procesos que implican más de una acción sobre las tablas de la Base de Datos... además, estás hablando de usuarios concurrentes y el comportamiento que mencionas es típico de cuando no usas transacciones o no manejas correctamente los niveles de aislamiento. Aquí lo que creo que está pasando es que estás teniendo "Lecturas Sucias" de tus tablas, es decir, que un usuario puede leer información de una tabla mientras está siendo modificada por otro usuario y esto hacer que las validaciones que puedas tener en tus SP no funcionen adecuadamente. pero para poder determinar que está mal necesitaríamos que nos mostraras el código de tus SP para ver qué estás haciendo.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

sql no reconoce datos previamente grabados en un registro

Publicado por juan manuel ortiz (2 intervenciones) el 06/08/2018 23:32:05
esta seria la estructura del procedimiento almacenado

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
create procedure marcar_proceso
	@ID_proceso AS INT=0,
	@ID_Trabajador as int=0,
	@Retorno AS INT = 0 OUTPUT
 
as
 
	DECLARE @TrabajoPrevio AS INT
	SET @TrabajoPrevio = 0
 
	BEGIN TRANSACTION
 
	/* estado 0= pendiente, 1= hecho */
	SELECT @Retorno = Estado, @ID_proceso = ID_proceso FROM procesosahacer
		WHERE ID_proceso = @ID_proceso
	SET @Error = @@ERROR
 
 
	IF @Error = 0 AND @Retorno <> 1
		BEGIN
			SELECT @TrabajoPrevio = count(ID_Trabajo) FROM trabajosrealizados WHERE ID_proceso = @ID_proceso
 
			IF @TrabajoPrevio > 0
				BEGIN
					SET @Retorno = 3 /* error */
					UPDATE procesosahacer SET Estado = 1
						WHERE ID_proceso = @ID_proceso
				END
 
			IF @TrabajoPrevio=0
				BEGIN
					UPDATE procesosahacer SET Estado = 1
						WHERE ID_proceso = @ID_proceso
					SET @Error = @@ERROR
 
 
					IF @Error = 0 AND @Retorno<>3
						BEGIN
 
									INSERT INTO trabajosrealizados (ID_Trabajador, ID_proceso)
										VALUES (@ID_Trabajador, @ID_proceso)
									SET @Error = @@ERROR
 
						END
				END
 
		END
 
	IF @Error = 0
		BEGIN
			COMMIT TRANSACTION
		END
	ELSE
		BEGIN
			ROLLBACK TRANSACTION
		END
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar