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