none
No me funciona el rollback RRS feed

  • Pregunta

  • Buen dia compañeros, tengo un stored procedure donde estoy utilizando transacciones y try catch
    el sp elimina registros de tablas y al final en otra tabla actualiza el status de PENDIENTE a ELIMINADO

    haciendo pruebas puse que marcara error en cierto registro para ver si funciono el rollback pero no
    le sigue cambiando el status a eliminado cuando debio quedarse en pendiente por el error generado, adjunto el codigo del sp 

    saludos.

    ALTER PROCEDURE xxx
    	
    AS
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
    	  DECLARE @Registros INT, @Contador INT, @INVTID VARCHAR(30), @USER1 VARCHAR(30), @ERROR VARCHAR(30), @Usuario VARCHAR(30), @Mensaje VARCHAR(max), @Prueba INT
    
      SELECT  IDENTITY(int, 1,1) AS Id, B.INVTID, B.USER1, A.Usuario INTO #T1
        FROM XIN_COMS_ELIMINAR A WITH(NOLOCK)
             INNER JOIN INVENTORY B  WITH(NOLOCK) ON A.COM = B.USER1
    
                      
      SELECT @Registros = ISNULL(COUNT(*),0)  FROM #T1                 
                      
      SET @Contador = 1  
      SET @Error = 0   
      SET @Mensaje = ''  
            
      IF @Registros =0 
    	BEGIN
    		SET @Mensaje = 'No existen los registros'
    		 SET @ERROR = 1    
               GOTO SALIR  
    	END
    	               
      WHILE @Contador <= @Registros BEGIN                   
                                 
            SELECT @INVTID = INVTID, @USER1 = USER1, @Usuario = Usuario FROM #T1 WITH(NOLOCK) WHERE Id = @Contador                      
                      
                      
            IF EXISTS(SELECT *                   
                        FROM ItemSIte WITH(NOLOCK)                  
                       WHERE InvtId like @INVTID AND
                             (QtyOnHand > 0 OR QtyAvail > 0)) BEGIN   
    			SET @Mensaje =  @Mensaje+'Articulo con existencia solomon: '+ @INVTID+' com: '+@USER1+'++'                
               SET @ERROR = 1    
               GOTO SALIR              
            END                  
                            
                     
            IF EXISTS(SELECT *                   
                        FROM Location WITH(NOLOCK)                  
                       WHERE InvtId like @INVTID ) BEGIN
              SET @Mensaje = @Mensaje+'Articulo con existencia solomon: '+ @INVTID+' com: '+@USER1+'++'           
    		   SET @ERROR = 1     
               GOTO SALIR              
            END                  
             
    
            IF EXISTS(SELECT *                   
                        FROM InTran WITH(NOLOCK)                  
                       WHERE InvtId like @INVTID ) BEGIN 
               SET @Mensaje = @Mensaje+'Articulo con movimientos de inventario solomon: '+ @INVTID+' com: '+@USER1+'++'        
    		   SET @ERROR = 1    
               GOTO SALIR              
            END                     
     
            IF EXISTS(SELECT *                   
                        FROM POTran WITH(NOLOCK)                  
                       WHERE InvtId like @INVTID ) BEGIN 
    		SET @Mensaje = @Mensaje+'Articulo con recepciones de compra solomon: '+ @INVTID+' com: '+@USER1+'++'        
               SET @ERROR = 1     
               GOTO SALIR              
            END                  
            
         
            SALIR:   
         
            IF @ERROR = 1 BEGIN
    
    			BEGIN TRY
    				BEGIN TRANSACTION
    					 /* 
    				
    					   DELETE SlsPrcDet
    						 FROM SlsPrcDet A
    							  INNER JOIN SLSPRC B ON A.SlsPrcId = B.SlsPrcId  
    						WHERE B.INVTID IN (@INVTID)
    
    
    */
    						UPDATE XIN_COMS_ELIMINAR
    						SET Estatus = 'ELIMINADO', Fecha=getdate()
    						WHERE Usuario = @Usuario
    				IF @USER1 = '2208-1013' BEGIN
    					SET @Prueba = 1/0
    				END
    
    			  SET @Mensaje = @Mensaje+'Eliminado correctamente solomon: '+ @INVTID+' com: '+@USER1+'++'        
    
    				COMMIT TRANSACTION
    			END TRY
    
    			BEGIN CATCH
    				 ROLLBACK TRANSACTION
    				SET @Mensaje = @Mensaje+ERROR_MESSAGE()+'++'
    				 /* SELECT ERROR_NUMBER() AS errNumber
    				   , ERROR_SEVERITY() AS errSeverity  
    				   , ERROR_STATE() AS errState
    				   , ERROR_PROCEDURE() AS errProcedure
    				   , ERROR_LINE() AS errLine
    				   , ERROR_MESSAGE() AS errMessage*/
    
    				  
    			END CATCH
                  
            END --if no hay error
             
            
            SET @Contador = @Contador + 1                   
                     
      END     --while
      SELECT @Mensaje as mensaje  
      DROP TABLE #T1
       
    	  SET NOCOUNT ON 
    END
    
    


    Un mundo de instrucciones.

    miércoles, 6 de junio de 2018 14:23

Todas las respuestas

  • Si el error ocurre al manipular los registros ANTES de cambiar el status a Eliminado, entonces no se resuelve nada porque ese cambio esta FUERA de la transaccion. Cuando haces el ROLLBACK, solo se deshace lo que se hizo despues del BEGIN TRANSACTION.

    En tu caso, lo unico que haces dentro de la transaccion es cambiar el status. Si ese cambio no da error, no se entra en el CATCH y no se hace el ROLLBACK, por lo que el status te queda cambiado. Hago enfasis en "ESE cambio". Otros cambios que pudieran haber dado error antes de que ejecutases el begin transaction no afectan ni al catch ni al rollback.

    miércoles, 6 de junio de 2018 15:57
  • Alberto pero estoy generando un error con la siguiente instruccion

    IF @USER1 = '2208-1013' BEGIN
    	SET @Prueba = 1/0
    END

    que es la division entre cero, y esta antes de hacer el commit tran, para ese registro primero cambia el estatus

    a eliminado, lo siguiente es que salta error por la division entre cero y debe regresarme a status pendiente pero no lo hace

    cabe mencionar que estoy haciendo un while y por cada registro estoys manejando un try catch y una transaccion

    no se si eso tenga algo que ver


    Un mundo de instrucciones.

    miércoles, 6 de junio de 2018 16:15
  • Muestra el valor de:

    @USER1

    Es muy probable que el valor sea distinto al que estas comparando.


    DBA SQL Server Santiago/Chile

    miércoles, 6 de junio de 2018 16:48
  • si entra porque en el log me manda error de division

    por ejemplo

    2208-1010 Eliminado

    2208-1011 Eliminado

    2208-10-13 Error de division

    2208-1013


    Un mundo de instrucciones.

    miércoles, 6 de junio de 2018 16:57
  • olvidenlo ya se donde esta el "error"

    UPDATE XIN_COMS_ELIMINAR
    						SET Estatus = 'ELIMINADO', Fecha=getdate()
    						WHERE Usuario = @Usuario

    me faltaba agregar otra condicion AND COM = 

    @USER1

    Un mundo de instrucciones.

    miércoles, 6 de junio de 2018 17:53