2010-02-22 31 views
1

我正在編寫一個程序,該程序使用ADO.NET的SqlCommand執行大量用戶提供的T-SQL語句批處理。阻止T-SQL語句提交應用程序啓動事務

我的應用程序打開一個事務,其中執行所有語句以確保執行任何錯誤時,整個批次都會回滾。

我遇到的問題是,在用戶提供的SQL中,放置不當的COMMIT(沒有匹配的BEGIN TRAN)會提交我的所有重要事務,並使我無法回滾。

有沒有人有任何想法如何我可以阻止用戶的SQL從我的交易搞亂,但仍然允許他們BEGIN/COMMIT/ROLLBACK自己的嵌套交易?

回答

1

您可以在distributed transaction中登記SqlCommand。那些不能用數據庫中的COMMIT語句提交。請參閱Connection對象的EnlistDistributedTransaction方法。

分佈式事務引入了一類全新的性能和可靠性問題。如果你能像AdaTheDev所建議的那樣修復T-SQL批處理,那將是一個更好的選擇。

1

您可以編程檢查每個T-SQL語句是否加載到SqlCommand單詞COMMIT中,以便您可以標記運行該T-SQL的潛在問題。

也許將它們歸檔到某處要手動查看。

+0

這是我最初的想法,但解析SQL並且仍然允許嵌套事務並不重要。 – rnwood

5

用戶的SQL需要更正 - 如果它的COMMIT(或ROLLBACKs)放置不當,那麼我會將它作爲一個需要修復的錯誤進行分類。我對你的場景的細節知之甚少,但我認爲這確實是你需要做的。如果您發現自己試圖實施一種解決方法,那麼警鐘就應該開始響起,因爲它會使系統更加複雜/難以維護。

+0

我完全同意這一般 - 是的,用戶SQL是真正的問題,一個解決方法是不理想的。不幸的是,在我的情況下,我需要能夠容忍這些錯誤。在一個理想的世界中,我會在執行它之前解析用戶SQL(根據@kevchadders的回答)並檢查這些問題,但我的感覺太困難了。 – rnwood

+0

@羅伯特伍德 - 我想你需要看看安多瑪的建議。解析SQL可能是一堆蠕蟲。我建議的唯一的其他選擇就是繼續像現在這樣繼續,並註銷那些導致問題的東西。 – AdaTheDev

相關問題