當前位置:首頁 » 編程語言 » sql觸發器中的事物回滾
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql觸發器中的事物回滾

發布時間: 2023-07-12 05:22:57

sql存儲過程中事務出現錯誤回滾,那麼在回滾之後的語句會執行嗎

會的。

一般回滾操作都是寫在異常處理,或是sql的最後。如果你的sql中出現錯誤 ,代碼會立即跳轉到錯誤處理代碼上執行,比如回滾,但緊接在錯誤行之後的代碼不會執行的。


1.update .....;

2.select ......;
3.when Exception
....rollback;
4.insert into .....

以上偽代碼,如果行1出錯,行2將不會執行,直接跳轉到行3,然後行4 也會執行。

㈡ SQL 觸發器中事物回滾什麼意思

當事物裡面的執行語句發生錯誤或者異常時Rollback,撤銷錯誤前執行的操作。

㈢ sql 事務自動回滾

你要用SET XACT_ABORT (Transact-SQL)

指定當 Transact-SQL 語句出現運行時錯誤時,SQL Server 是否自動回滾到當前事務。
當 SET XACT_ABORT 為 ON 時,如果執行 Transact-SQL 語句產生運行時錯誤,則整個事務將終止並回滾。

當 SET XACT_ABORT 為 OFF 時,有時只回滾產生錯誤的 Transact-SQL 語句,而事務將繼續進行處理。如果錯誤很嚴重,那麼即使 SET XACT_ABORT 為 OFF,也可能回滾整個事務。OFF 是默認設置。

編譯錯誤(如語法錯誤)不受 SET XACT_ABORT 的影響。

㈣ sql語句中用什麼語句實現事務的回滾

-開啟事務 begin tran --執行操作 update Accounts_UsersExp set TelPhone=123456 where userid=14 --執行錯誤事務回滾 rollback --如果正確進行事務提交 commit

㈤ sql中的存儲過程里怎麼寫事務回滾啊

CREATE PROC [dbo].[notice_Delete] --- 同時刪除該通知書和對應的節點
@tbl VARCHAR(30),
@pid INT
AS
BEGIN
DECLARE @tblname VARCHAR(30) ;
DECLARE @sql VARCHAR(1000) ;
SET @tblname = @tbl
SET @sql = 'delete ' + @tblname + ' where id ='
+ CONVERT(VARCHAR(10), @pid)

BEGIN TRAN --開始事務

EXEC ( @sql
)
IF ( @@rowcount = 0 ) --執行結果影響行數為0
BEGIN
ROLLBACK TRAN --回滾
END
ELSE
BEGIN
DELETE FROM tbl_treenotice
WHERE purposeid = @pid
IF ( @@rowcount = 0 ) --執行結果影響行數為0
BEGIN
ROLLBACK TRAN --回滾
END
ELSE
BEGIN
COMMIT TRAN --提交事務
END
END
END

㈥ sql2005的update觸發器中,回滾後老是報錯

在觸發器中無需提交獲回滾,它應該屬於調用它的事務,它的提交或回滾會導致這個事務的提交或回滾.當檢查到約束不合法時不應該回滾,而應該拋出異常(sqlserver中好象用RAISERROR),異常會導致主事務回滾。

㈦ 觸發器中執行回滾SQL SERVER2000,,,高分

如果 @@TRANCOUNT 的值在存儲過程完成時與過程執行時不同,則會生成一個 266 信息類錯誤。該錯誤不是由觸發器中同一個條件生成的。

當調用存儲過程時,如果 @@TRANCOUNT 為 1 或更大,並且該過程執行 ROLLBACK TRANSACTION 或 ROLLBACK WORK 語句,則會產生 266 號錯誤。這是因為 ROLLBACK 回滾所有未完成的事務,並將 @@TRANCOUNT 減到 0,該值比調用過程時要小。

如果在觸發器中發出 ROLLBACK TRANSACTION:

◆對當前事務中的那一點所做的所有數據修改都將回滾,包括觸發器所做的修改。

◆觸發器繼續執行 ROLLBACK 語句之後的所有其餘語句。如果這些語句中的任意語句修改數據,則不回滾這些修改。執行其餘的語句不會激發嵌套觸發器。

◆在批處理中,所有位於激發觸發器的語句之後的語句都不被執行。

◆觸發器中的 ROLLBACK 關閉並釋放所有在包含激發觸發器的語句的批處理中聲明和打開的游標。這其中包括了在激發觸發器的批處理所調用的存儲過程中聲明和打開的游標。在激發觸發器的批處理之前的批處理中所聲明的游標將只是關閉,但是在以下條件下,STATIC 或 INSENSITIVE 游標不關閉:

·CURSOR_CLOSE_ON_COMMIT 設置為OFF。

·靜態游標要麼是同步游標,要麼是完全填充的非同步游標。

當執行觸發器時,觸發器的操作總是好像有一個未完成的事務在起作用。如果激發觸發器的語句是在隱性或顯式事務中,則肯定會這樣。在自動提交模式下,也是如此。當語句開始以自動提交模式執行時,如果遇到錯誤,則會有隱含的 BEGIN TRANSACTION 語句允許恢復該語句生成的所有修改。該隱含的事務對批處理中的其它語句沒有影響,因為當語句完成時,該事務要麼提交,要麼回滾。但是,當調用觸發器時,該隱含的事務將仍然有效。

這意味著,只要觸發器中發出 BEGIN TRANSACTION 語句,則實際上就開始了一個嵌套事務。因為當回滾嵌套事務時,嵌套的 BEGIN TRANSACTION 語句將被忽略,觸發器中發出的 ROLLBACK TRANSACTION 總是回滾過去該觸發器本身發出的所有 BEGIN TRANSACTION 語句。ROLLBACK 回滾到最外部的 BEGIN TRANSACTION。

若要在觸發器中進行部分回滾,則即使總是以自動提交模式進行調用,也必須使用 SAVE TRANSACTION 語句。以下的觸發器闡明了這一點:

CREATE TRIGGER TestTrig ON TestTab FOR UPDATE AS
SAVE TRANSACTION MyName
INSERT INTO TestAudit
SELECT * FROM inserted
IF (@@error <> 0)
BEGIN
ROLLBACK TRANSACTION MyName
END

這也影響觸發器中 BEGIN TRANSACTION 語句後面的COMMIT TRANSACTION 語句。因為 BEGIN TRANSACTION 啟動一個嵌套事務,而隨後的 COMMIT 語句只應用於該嵌套事務。如果在 COMMIT 之後執行 ROLLBACK TRANSACTION 語句,那麼 ROLLBACK 將一直回滾到最外部的 BEGIN TRANSACTION。以下的觸發器闡明了這一點:

CREATE TRIGGER TestTrig ON TestTab FOR UPDATE AS
BEGIN TRANSACTION
INSERT INTO TrigTarget
SELECT * FROM inserted
COMMIT TRANSACTION
ROLLBACK TRANSACTION

此觸發器絕對不會在 TrigTarget 表中插入。BEGIN TRANSACTION 總是啟動一個嵌套事務。COMMIT TRANSACTION 只提交嵌套事務,而下面的 ROLLBACK TRANSACTION 則一直回滾到最外部的 BEGIN TRANSACTION。

㈧ SQL語言中,用於事務回滾的語句是什麼

回滾要放在事務裡面進行,才能進行回滾;sql裡面的事務使用關鍵字TransAction
1:可以用try catch捕獲
begin try
begin tran
update table set a=1;
commit tran
end Try
begin catch
rollback tran
end catch

2:可以使用error 全局變數
begin tran
update tablename set ad=1111
if @@error<>0 begin rollback end
commit tran

注意:如果一個事務寫了 begin trans ,後面一定要跟上 commit tran或 rollback transaction ,否則可能導致被鎖