Лучший способ объединить транзакции вставки, обновления и удаления в SQL Server 2008? - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть процесс входа в систему для моего приложения, который должен выполнить три разные транзакции, если пользователь успешно прошел аутентификацию.Вот пример моего текущего кода:

<cftransaction action="begin">  
    <cftry>
        <cfset local.appStruct = structNew()>
        <cfset local.appStruct.AccountID = UserResults.AccountID>
        <cfset local.appStruct.UserName = UserResults.UserName>
        <cfset local.appStruct.Email = UserResults.Email>
        <cfset session.AccountInfo = appStruct>
        <cfset session.LoggedIn = true>

        <cfquery name="trackLogin" datasource="#dsn#">
            DELETE
            FROM FailedLogins
            WHERE LoginUN = <cfqueryparam cfsqltype="cf_sql_varchar" value="#trim(arguments.username)#" maxlength="50">

            UPDATE Accounts
            SET LockedUntil = NULL
            WHERE UserName = <cfqueryparam cfsqltype="cf_sql_varchar" value="#trim(arguments.username)#" maxlength="50">

            INSERT INTO AccountLogins (
                AccountID,
                Login
            )VALUES(
                <cfqueryparam cfsqltype="cf_sql_idstamp" value="#UserResults.AccountID#">,
                CURRENT_TIMESTAMP
            )
        </cfquery>

        <cfset local.fnResults = {status : "200"}>

        <cfcatch type="any">
            <cftransaction action="rollback" />
                <cfset local.fnResults = {error : cfcatch, status : "400", message : "Error! Please contact your administrator."}>
        </cfcatch>
    </cftry>
</cftransaction>

В приведенном выше коде сначала я устанавливаю переменные session, а затем очищаю логины Failed, затем обновляю флаг и вставляю некоторую информацию в таблицу входа в аккаунт.,Сначала я хотел бы переместить это в процедуру хранения.Тогда мне интересно, есть ли хороший способ объединить эти три транзакции в одну или они должны быть отдельными хранимыми процедурами?Если у кого-то есть совет или веская причина, почему так или иначе, пожалуйста, дайте мне знать.Спасибо.

1 Ответ

0 голосов
/ 19 сентября 2018

Во избежание ошибок в вашей хранимой процедуре вы можете использовать блоки типа try catch:

BEGIN TRY
     BEGIN TRAN
    'T-SQL code
    COMMIT TRAN
END TRY
BEGIN CATCH
    IF(@@TRANCOUNT > 0)
        ROLLBACK TRAN;

    THROW; -- raise error
END CATCH
...