在 SQL Server 2008 中合并插入、更新和删除事务的最佳方式?

Best way to combine Insert, Update and Delete transaction in SQL Server 2008?

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

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

为了防止错误,在您的存储过程中,您可以像这样使用 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