在SQL Server 2008中结合插入,更新和删除事务的最佳方法?

时间:2018-09-19 12:47:15

标签: sql sql-server-2008 stored-procedures sqltransaction

我有我的应用程序的登录过程,如果用户成功通过了身份验证,则应运行三个不同的事务。这是我当前代码的示例:

<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变量,然后清理了失败的登录名,然后更新了标志并在“帐户”登录表中插入了一些信息。首先,我想在存储过程中移动它。然后,我想知道是否存在一种将这三个事务合并为一个好的方法,或者它们应该是独立的存储过程?如果有人建议或有正当理由为什么一种方式或另一种方式,请告诉我。谢谢。

1 个答案:

答案 0 :(得分:1)

为防止错误,在存储过程中,可以使用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
相关问题