DB

com.microsoft.sqlserver.jdbc.SQLServerException: 현재 트랜잭션은 커밋할 수 없으며 로그 파일에 쓰는 작업을 지원하지 않습니다. 트랜잭션을 롤백하십시오.; nested exception is com.ibatis.common.jdbc.exception.Nested..

이메일 발송 프로세스에서 이메일 전송 후 기록을 남기기 위해 저장 프로시저 호출 로직을 추가하였다.

하지만 아래와 같은 오류가 발생하였다.

[오류가 발생한 프로시저]

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE SAVE_DATA
(  
	@P_USER_ID			VARCHAR(30)		= ''

,	@P_ERROR_CD			VARCHAR(30)		= ''	OUTPUT
,	@P_ROW_COUNT		INT				= 0		OUTPUT
,	@P_RETURN_STR		NVARCHAR(100)	= ''	OUTPUT
) 
AS 
SET NOCOUNT ON
	
BEGIN	
    BEGIN TRY		
			UPDATE TABLE_TEST
			SET UPD_TIME = GETDATE()
			WHERE USER_ID = @P_USER_ID

			SELECT @P_ROW_COUNT = @@ROWCOUNT;
			
			IF @P_ROW_COUNT > 0
				SET @P_ERROR_CD = 'MSG0004';
			ELSE
				SET @P_ERROR_CD = 'MSG0030';        
    END TRY
    BEGIN CATCH    
    
		SELECT @P_ERROR_CD = (CASE SUBSTRING(@P_ACTION_TP,1,1)
									WHEN 'Q' THEN 'ERR0006'
									WHEN 'N' THEN 'ERR0008'
									WHEN 'U' THEN 'ERR0009'
									WHEN 'D' THEN 'ERR0010'
									ELSE 'ERR0000'
								END);
    END CATCH;
END

 

[오류 내용]

org.springframework.jdbc.UncategorizedSQLException: SqlMapClient operation; uncategorized SQLException for SQL []; SQL state [S0001]; error code [3930];   
The error occurred in sqlmap/ubsales/email/email.xml.  
The error occurred while applying a parameter map.  
Check the mail.sendMailLibLinkManage-InlineParameterMap.  
Check the statement (update procedure failed).  
Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 현재 트랜잭션은 커밋할 수 없으며 로그 파일에 쓰는 작업을 지원하지 않습니다. 트랜잭션을 롤백하십시오.; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException:   
The error occurred in sqlmap/ubsales/email/email.xml.  
The error occurred while applying a parameter map.  
Check the mail.sendMailLibLinkManage-InlineParameterMap.  
Check the statement (update procedure failed).  

 

[해결]

프로시저에서 데이터 저장시 BEGIN TRAN, COMMIT TRAN, ROLLBACK TRAN 명령어를 추가해주어서 해결하였다.

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE SAVE_DATA
(  
	@P_USER_ID			VARCHAR(30)		= ''

,	@P_ERROR_CD			VARCHAR(30)		= ''	OUTPUT
,	@P_ROW_COUNT		INT				= 0		OUTPUT
,	@P_RETURN_STR		NVARCHAR(100)	= ''	OUTPUT
) 
AS 
SET NOCOUNT ON
	
BEGIN	
    BEGIN TRY		
		BEGIN TRAN
			UPDATE TABLE_TEST
			SET UPD_TIME = GETDATE()
			WHERE USER_ID = @P_USER_ID

			SELECT @P_ROW_COUNT = @@ROWCOUNT;
			
			IF @P_ROW_COUNT > 0
				SET @P_ERROR_CD = 'MSG0004';
			ELSE
				SET @P_ERROR_CD = 'MSG0030';        
		COMMIT TRAN
    END TRY
    BEGIN CATCH    
		ROLLBACK TRAN    

		SELECT @P_ERROR_CD = (CASE SUBSTRING(@P_ACTION_TP,1,1)
									WHEN 'Q' THEN 'ERR0006'
									WHEN 'N' THEN 'ERR0008'
									WHEN 'U' THEN 'ERR0009'
									WHEN 'D' THEN 'ERR0010'
									ELSE 'ERR0000'
								END);
    END CATCH;
END

 

 

[REFERENCE]

 

[연관자료]

 

Leave a Reply

error: Content is protected !!