當前位置:首頁 » 存儲配置 » 存儲過程回滾事務

存儲過程回滾事務

發布時間: 2022-09-02 16:01:10

存儲過程的問題 回滾

看你程序怎麼寫的,如果循環中每次插入每次提交自然回滾不了了,一般來說是整個作為一個事務,在發生錯誤異常處理時候做ROLLBACK。存儲過程自己沒有回滾功能,要你在程序中控制事務完整性的。如果你不寫commit也不寫rollback的話,自動作為一個事務整體會失敗,事務自動回滾,如果執行成功,事務結束則自動提交。

② 存儲過程與事物回滾的問題

答案是:任何情況下的事務嵌套.只要任何地方出錯,全回滾.

事務組合一系列任務為一個執行單元。每個事務以特定的任務開始,以特定的任務結束。當所有的任務成功時事務成功,當任何一個任務失敗時,事務失敗。所以一個事務只有兩個結果:失敗或成功。

請參考:《sql Server的事務和錯誤處理》:
http://www.it118.org/specials/c9fba99e-4401-49cf-8256-ac3c1a34c0d9/33827942-5e09-42f9-a409-235a099616b3.htm

③ sqlserver 存儲過程事務回滾怎麼寫

begin tran
。。。。。。
在存儲過程後面加上:
if @@error<>0
rollback tran
else
commit tran

④ SQL存儲過程,如何回滾啊

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

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

對於大多數 OLE DB 提供程序(包括 SQL Server),必須將隱式或顯示事務中的數據修改語句中的 XACT_ABORT 設置為 ON。唯一不需要該選項的情況是在提供程序支持嵌套事務時。有關詳細信息,請參閱 分布式查詢和分布式事務。

SET XACT_ABORT 的設置是在執行或運行時設置,而不是在分析時設置。

示例
下列代碼示例導致在含有其他 Transact-SQL 語句的事務中發生外鍵沖突錯誤。在第一個語句集中產生錯誤,但其他語句均成功執行且事務成功提交。在第二個語句集中,將 SET XACT_ABORT 設置為 ON。這導致語句錯誤使批處理終止,並使事務回滾。

復制代碼
USE AdventureWorks;
GO
IF OBJECT_ID(N't2', N'U') IS NOT NULL
DROP TABLE t2;
GO
IF OBJECT_ID(N't1', N'U') IS NOT NULL
DROP TABLE t1;
GO
CREATE TABLE t1
(a INT NOT NULL PRIMARY KEY);
CREATE TABLE t2
(a INT NOT NULL REFERENCES t1(a));
GO
INSERT INTO t1 VALUES (1);
INSERT INTO t1 VALUES (3);
INSERT INTO t1 VALUES (4);
INSERT INTO t1 VALUES (6);
GO
SET XACT_ABORT OFF;
GO
BEGIN TRANSACTION;
INSERT INTO t2 VALUES (1);
INSERT INTO t2 VALUES (2); -- Foreign key error.
INSERT INTO t2 VALUES (3);
COMMIT TRANSACTION;
GO
SET XACT_ABORT ON;
GO
BEGIN TRANSACTION;
INSERT INTO t2 VALUES (4);
INSERT INTO t2 VALUES (5); -- Foreign key error.
INSERT INTO t2 VALUES (6);
COMMIT TRANSACTION;
GO
-- SELECT shows only keys 1 and 3 added.
-- Key 2 insert failed and was rolled back, but
-- XACT_ABORT was OFF and rest of transaction
-- succeeded.
-- Key 5 insert error with XACT_ABORT ON caused
-- all of the second transaction to roll back.
SELECT *
FROM t2;
GO

⑤ JDBC調用存儲過程,存儲過程中事務回滾,報錯

ConnCloseThread中關閉連接的時候,不是立刻返回的。Connection.close()會觸發Connection.commit(),而因為調用的存儲過程中,存儲過程起了自己的事務,connection.commit()必須等到存儲過程結束才能完成(這個是microsoft論壇上看到的)。如果所有connection.close()都等到tx commit或rollback完成才執行的話,這個問題就不會出現了
從測試結果來看,凡是close connection耗時比execute statement短的,連接(物理連接)都會報出該問題。分析原因:通過weblogic datasource獲取的connection並不是物理connection,而是由weblogic wrapped的connection。這些conection在被close後,並不會關閉物理連接,而只是將物理連接還池。我們對connection的所有操作,最終都會被delegated到底層物理連接上,即commit(),rollback()最終都是在物理連接上執行。如果上面的connection.close(),底層物理連接沒有等到存儲過程事務結束就返回的話,那麼物理連接上應該還帶有此次操作的事務,而weblogic這邊不會關系物理連接的情況,直接將連接放入connection pool供其它客戶端使用。這時候如果設定了test on reserve的話,下次客戶端從data source獲取連接時,weblogic會檢查這個物理連接,作一個select操作的,這個有問題的連接就會暴露出來,也就是上面的異常。這個問題如果使用driver manager來獲取連接的話(如果每次都關閉的話),則不會出現,因為使用的物理連接每次都是不同的。還好,weblogic會幫忙重新創建有問題的連接。原因大概了解了,但這是誰的問題呢? 為什麼connection.close()不等存儲過程的事務結束?

結論:一般而言,我們不建議通過JDBC調用存儲過程的時候,在存儲過程中定義事務,應該將tx的管理工作交給jdbc去做。 non-xa如此,xa亦如此,畢竟事務嵌套了以後,管理起來是個問題,完整性更是個問題。

⑥ 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

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

會的。

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


1.update .....;

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

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

⑧ 存儲過程回滾 急

BEGIN TRY

END
BEGIN CATCH
END CATCH
用這個試試呢

⑨ SQL Server存儲過程裡面是更新某個表,那麼如何在這個基礎上增加更新失敗時的事務回滾語句

更新失敗不需要回滾因為都沒執行成功,一般是多個插入,更新操作需要事務處理

⑩ Oracle怎麼顯式開啟事務,開始事務跟鎖有什麼關系,在存儲過程中有時怎麼開啟和提交,回滾事務的

oracle使用語句savepoint sp_begintran開啟顯式事務,鎖本身和事務是沒有關系的,只要是資料庫的操作都會產生鎖。處於事務中的SQL語句只有這個事務提交(commit)之後,事務中的SQL語句影響的表記錄上的鎖才會釋放。鎖常見有共享鎖(select語句產生)和排它鎖(DML語句產生),如果一個表上載入有共享鎖,還可以疊加共享鎖,但不能疊加排它鎖。如果一個表上載入有排他鎖,就什麼鎖都不能加了,也就是說如果DML語句佔用過多的時間,這些資料庫效率就不高,就需要優化,當然select語句性能低了也不行。
每個存儲過程可以不用顯式事務,它本身就為你開啟了一個隱式事務,如果需要開啟顯示事務,就通過savepoint sp_begintran開啟,無論是不是顯式還是隱式事務,你都得通過commit work提交事務,通過exception捕捉SQL語句異常,在異常發生時需要回滾事務(rollback work)。

熱點內容
伺服器如何遠程連接伺服器 發布:2025-01-06 19:18:32 瀏覽:448
多台存儲伺服器之間如何連接 發布:2025-01-06 19:17:50 瀏覽:84
溯源碼在哪 發布:2025-01-06 19:10:01 瀏覽:983
ios和安卓如何變成師徒關系 發布:2025-01-06 18:58:00 瀏覽:332
win7安卓電腦卡怎麼辦 發布:2025-01-06 18:56:02 瀏覽:158
qq音樂存儲位置 發布:2025-01-06 18:55:57 瀏覽:177
偵察分選演算法 發布:2025-01-06 18:50:47 瀏覽:955
編程蛙 發布:2025-01-06 18:50:10 瀏覽:271
伺服器cpu16c是什麼意思 發布:2025-01-06 18:33:16 瀏覽:682
python教程電子書下載 發布:2025-01-06 18:24:00 瀏覽:465