簡體   English   中英

SQL Server如何始終回滾整個事務

[英]SQL Server How to always rollback the entire transaction

我有一些不尋常的交易處理需求。

我正在為SQL Server設計一個變異測試框架,為此,我需要在一個事務內運行測試,以便數據庫始終處於測試完成時開始的狀態。

但是,我有一個問題,用戶可以在測試過程中進行編碼,並且可以調用rollback transaction ,該rollback transaction可以位於(嵌套)事務(保存點)中,也可以不在(嵌套)事務中。

高水平看起來像這樣

start transaction
initialize test
run test with user code
   may or may not contain:
      - start tran
      - start tran savename
      - commit tran
      - commit tran savename
      - rollback tran
      - rollback tran savename
output testresults
rollback transaction

有沒有辦法確保我最終可以始終回滾到初始狀態? 我必須考慮到用戶可以調用可能嵌套的並且都可以包含事務處理語句的存儲過程/觸發器。 使用我所有的解決方案,當用戶在測試代碼中使用回滾tran時,它們就逃避了事務,並且不會清除所有內容

我想要的是,如果用戶調用回滾,則僅回滾其事務的一部分,而我在測試初始化​​之前啟動的事務仍然完好無損。

如果有可能,我想防止強迫我的用戶使用事務模板,該事務模板在存在事務時使用保存點。

如果沒有用戶代碼的任何通信/規則,我認為這是不可能的。 盡管您做了什么,但是如果用戶的代碼運行的COMMIT與當時的@@TRANCOUNT一樣多,則將COMMIT事務,您將無能為力。

一種執行此操作的方法是,如果您檢查/強制執行用戶代碼,而不是使用COMMITif @@TRANCOUNT>=2 COMMIT更改為if @@TRANCOUNT>=2 COMMIT 這將確保只能通過YOUR COMMIT命令完成TRUE數據提交。 當然,您確實不想提交,所以您只需rollback就可以了。

您提到:

我想要的是,如果用戶調用回滾,則僅將其部分事務回滾

請注意,嵌套交易是一種神話。 請參閱這篇出色的文章 長話短說:“嵌套” BEGIN TRANSACTIONCOMMIT實際上除了更改系統變量var @@TRANCOUNT的值外實際上什么也不做,因此可以通過過程來進行某些組織。

我認為不可能回滾一部分交易並保持另一筆交易不變。 我們回滾事務的那一刻,整個事務都會回滾。

如服務器端所指出的,SQL Server不支持其他嵌套事務。 我決定在用戶​​代碼之后盡量減少狀態更改語句的數量,並在測試批處理開始時清理這些語句。 通過這種方式,我不能回滾自己的事務並不重要,因為繁重的工作將由我或用戶回滾。

當起始@@ TRANCOUNT和結束@@ TRANCOUNT不匹配時,我還決定使測試失敗,以便在用戶事務出現問題時無法通過任何測試。

但是,當前系統仍將與用戶進行COMMIT TRAN斗爭。 這又是一個問題。

我認為實際需要是為T-SQL編寫測試用例。 如果那是正確的話,那么我覺得您不必重新發明輪子並開始使用開源測試框架T-SQLT https://tsqlt.org/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM