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]
- https://social.technet.microsoft.com/Forums/ie/en-US/492bd874-fc0b-4348-ba0f-d84a2eb17007/sql-server-error-3930?forum=visiogeneral
- https://stackoverflow.com/questions/12101005/finding-the-cause-of-a-3930-sql-server-error
[연관자료]