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