2012-06-23 1 views
0

Я видел сообщения и пытался решить эту проблему, но не смог. Итак, вот код. Помогите решить то же самое.SQLException: Transaction BEGIN/COMMIT несоответствие

У меня есть одна процедура, которая вызывает другую процедуру.

Процедура Caller:

ALTER PROCEDURE [dbo].[DadSaveMembership] 
@PERSON AS [dbo].[Person_Master_Type] Readonly, 
@ADDRESS AS [dbo].[Address_Master_Type] Readonly, 
@MEMBERSHIP AS [dbo].[Membership_Type] Readonly 

AS 
BEGIN 

declare @pid int, @aid int, @CUR_PID int, @CUR_ADD int, @atype int, @created_by int 
declare @created_date date 

select @pid=person_id from @PERSON 
select @aid=address_id from @ADDRESS 

if(@pid=0) 
begin 
    INSERT INTO PERSON_MASTER (TITLE,FNAME,MNAME,LNAME,DOB,GENDER,MARITALSTATUS,MOBILE,EMAIL,CREATED_BY,CREATED_DATE) 
    SELECT TITLE,FNAME,MNAME,LNAME,DOB,GENDER,MARITALSTATUS,MOBILE,EMAIL,CREATED_BY,CREATED_DATE FROM @PERSON 
    SELECT @CUR_PID=MAX(PERSON_ID) FROM PERSON_MASTER 
end 
else 
begin 
    set @[email protected] 
end 

if(@aid=0) 
begin 
    INSERT INTO ADDRESS_MASTER (ADDRESS1,ADDRESS2,ADDRESS3,CITY_ID,PINCODE,PHONE,CREATED_BY,CREATED_DATE) 
    SELECT ADDRESS1,ADDRESS2,ADDRESS3,CITY_ID,PINCODE,PHONE,CREATED_BY,CREATED_DATE FROM @ADDRESS 
    SELECT @CUR_ADD=MAX(ADDRESS_ID) FROM ADDRESS_MASTER 
end 
else 
begin 
    set @[email protected] 
end 



EXEC [dbo].[GET_DAD_COUNT_AID$IMPL$AUTO] @CUR_PID, "3", @CUR_ADD, @atype OUTPUT 

INSERT INTO PERSON_MODULE_LINK (PERSON_ID,MODULE_ID,ADDRESS_ID,ADDRESS_TYPE,CREATED_BY,CREATED_DATE) 
VALUES (@CUR_PID,3,@CUR_ADD,@atype,@CREATED_BY,@CREATED_DATE) 

END 

Другой способ заключается в следующем

ALTER PROCEDURE [dbo].[GET_DAD_COUNT_AID$IMPL$AUTO] 
@pid int, 
@modid int, 
@addrid int, 
@return_value_argument int OUTPUT 
AS 

BEGIN 

    SET IMPLICIT_TRANSACTIONS ON 

    DECLARE 
    @cnt int, 
    @cnt1 int 


    SELECT @cnt1 = isnull(max(CAST(ADDRESS_HISTORY_DETAIL.ADDRESS_TYPE AS numeric(38, 10))), 0) 
    FROM dbo.ADDRESS_HISTORY_DETAIL 
    WHERE 
    ADDRESS_HISTORY_DETAIL.PERSON_ID = @pid AND 
    ADDRESS_HISTORY_DETAIL.MODULE_ID = @modid AND 
    ADDRESS_HISTORY_DETAIL.ADDRESS_ID = @addrid 



    SELECT @cnt = isnull(max(CAST(PERSON_MODULE_LINK.ADDRESS_TYPE AS numeric(38, 10))), 0) 
    FROM dbo.PERSON_MODULE_LINK 
    WHERE 
    PERSON_MODULE_LINK.PERSON_ID = @pid AND 
    PERSON_MODULE_LINK.MODULE_ID = @modid AND 
    PERSON_MODULE_LINK.ADDRESS_ID = @addrid 



    IF @cnt1 > @cnt 
    BEGIN 

     SET @return_value_argument = @cnt1+1 

     RETURN 

    END 
    ELSE 
    BEGIN 

     SET @return_value_argument = @cnt+1 

     RETURN 

    END 

END 

проблема я получаю следующее сообщение об ошибке, когда DadSaveMembership SP называется: Время ожидания истекло. Период ожидания истекает до завершения операции или сервер не отвечает. Итак, что не так?

+0

Какова реальная проблема? Вы отправили два запроса, не указав, в чем проблема. – Kane

+0

изменить мой вопрос, чтобы рассказать актуальную проблему –

ответ

0

Я подозреваю, что проблема заключается в команде SET IMPLICIT_TRANSACTIONS ON в хранимой процедуре GET_DAD_COUNT_AID $ IMPL $ AUTO. Чтение MSDN показало бы, что, установив команду и выполнив команду SELECT, транзакция будет создана, но никогда не будет выполнена или откатна. Вы можете либо обернуть оригинал SP в транзакции BEGIN TRANSACTION + COMMIT/ROLLBACK или удалить заявление вместе.

Вы должны также рассмотреть вопрос о замене этих двух заявлений:

SELECT @CUR_ADD=MAX(ADDRESS_ID) FROM ADDRESS_MASTER 
SELECT @CUR_PID=MAX(PERSON_ID) FROM PERSON_MASTER 

с этим:

SELECT @CUR_ADD = SCOPE_IDENTITY() 
SELECT @CUR_PID = SCOPE_IDENTITY() 
+0

Хорошо. попробует и вернется. –

+0

попробовал то, что вы сказали, но это не решение моей реальной проблемы –