sqlserver中事務總結:begin tran,rollback tran,commit tran SQL事務用法begin tran,commit tran和rollback tran的用法
第1個相關用法:摘自:https://shiyousan.com/post/f13d29b7-0d87-4168-bd8b-8b28b0991b5a
以下是出現錯誤的SQL部分語句:
此錯誤的原因是由於一個事務只能對應一個操作,要麼回滾要麼提交,所以執行了ROLLBACK TRAN語句後一定不能再執行COMMIT TRAN語句!!!而無論是回滾事務還是提交事務,都是不會中斷SQL處理流程的,要想中斷流程就需要使用RETURN語句。
上面範例中的語句先執行了ROLLBACK TRAN回滾操作(這裡造成事務已經處理完成),但是並沒有中斷流程,所以後面的語句依然會繼續執行。執行過程中由於沒有任何異常錯誤,最終導致重複執行了底部的COMMIT TRAN事務提交操作,最後一次事務操作沒有找到相匹配的事務宣告,就會提示"COMMIT TRANSACTION(事務提交) 請求沒有對應的 BEGIN TRANSACTION(事務宣告)"這個錯誤。
所以要跳出事務,在進行回滾ROLLBACK操作後,還必須馬上使用RETURN語句跳出執行流程。以下為修改後的語句:
這裡在做一個簡單測試,有助於理解所謂的一個事務只能對應一個事務操作的意思,在SQL中輸入下圖的三行程式碼並執行:
總結: roolback 之後不能再次commit,事務只能開啟一個!!!
第2個用法總結:https://www.cnblogs.com/accumulater/p/6089822.html
SQL事務用法begin tran,commit tran和rollback tran的用法
Sql Server 2005/2008中提供了begin tran,commit tran和rollback tran來使用事務。
begin tran表示開始事務,
commit tran表示提交事務,
rollback tran表示回滾事物
EXEC TEST_PROC '文綜','包括歷史,地理,政治','政治','文綜的一門'
CREATE PROCEDURE [dbo].[TEST_PROC]
@A_Name NVARCHAR(20), -- A表姓名
@A_Remark NVARCHAR(4000), -- A表備註
@B_Name NVARCHAR(20), -- B表姓名
@B_Remark NVARCHAR(4000) -- B表備註
AS
BEGIN TRY
BEGIN TRAN
-- 在A表中插入資料
INSERT INTO [dbo].[A]
( [A_Name]
, [A_Remark] )
VALUES
( @A_Name
, @A_Remark )
-- 在B表中插入資料
INSERT INTO [dbo].[B]
( [A_ID]
, [B_Name]
, [B_Remark] )
VALUES
( @@IDENTITY -- 返回最後插入的標識值
, @B_Name
, @B_Remark )
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK TRAN
INSERT INTO [dbo].[ErrorLog]
( [EL_Procedure] -- 異常儲存過程名稱
, [EL_OperateTime] ) -- 報異常時間
VALUES
( 'TEST_PROC'
, CONVERT(DATETIME,GETDATE(),20) )
END CATCH
注:1. @@IDENTITY的作用是返回最後插入的標識值。
2. 我在rollback tran中加入一個專門記錄異常的表,以便產於異常發生的時間和確定報異常的儲存過程的名稱。
原文連結:
begin tran 可以理解成新建一個還原點。
commit tran提交這個自begin tran開始的修改
rollback tran 表示還原到上個還原點
Sql Server 2005/2008中提供了begin tran,commit tran和rollback tran來使用事務。
begin tran表示開始事務,
commit tran表示提交事務,
rollback tran表示回滾事物
EXEC TEST_PROC '文綜','包括歷史,地理,政治','政治','文綜的一門'
CREATE PROCEDURE [dbo].[TEST_PROC]
@A_Name NVARCHAR(20), -- A表姓名
@A_Remark NVARCHAR(4000), -- A表備註
@B_Name NVARCHAR(20), -- B表姓名
@B_Remark NVARCHAR(4000) -- B表備註
AS
BEGIN TRY
BEGIN TRAN
-- 在A表中插入資料
INSERT INTO [dbo].[A]
( [A_Name]
, [A_Remark] )
VALUES
( @A_Name
, @A_Remark )
-- 在B表中插入資料
INSERT INTO [dbo].[B]
( [A_ID]
, [B_Name]
, [B_Remark] )
VALUES
( @@IDENTITY -- 返回最後插入的標識值
, @B_Name
, @B_Remark )
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK TRAN
INSERT INTO [dbo].[ErrorLog]
( [EL_Procedure] -- 異常儲存過程名稱
, [EL_OperateTime] ) -- 報異常時間
VALUES
( 'TEST_PROC'
, CONVERT(DATETIME,GETDATE(),20) )
END CATCH
注:1. @@IDENTITY的作用是返回最後插入的標識值。
2. 我在rollback tran中加入一個專門記錄異常的表,以便產於異常發生的時間和確定報異常的儲存過程的名稱。
原文連結:
begin tran 可以理解成新建一個還原點。
commit tran提交這個自begin tran開始的修改
rollback tran 表示還原到上個還原點