2012-09-18 24 views
1

我進入了一個使用.NET/C#作爲前端,SQL Server 2008作爲後端的應用程序。我發現ALWAYS事務是在C#代碼中處理的。看來這是一個不成文的規則,我們不應該使用存儲過程中的事務。事務應該在.NET或SQL Server中處理?

我個人覺得應該在存儲過程中處理事務,因爲它可以更好地控制代碼!我們可能會在腳本中發生大量驗證,而我們不需要公開交易。我們需要在插入/更新/刪除之前打開一個事務,並且可以儘快關閉它。

尋找答案可以幫助我理解處理交易的最佳實踐,以及何時我們需要選擇Stored Proc/C#中的交易。

回答

1

沒有一個硬性的規定,但我看到幾個原因,從業務層控制交易:

  • 跨越數據存儲邊界通信。交易不必違背RDBMS;他們可以針對各種實體。

  • 基於可能不適用於您正在調用的特定存儲過程的業務邏輯回滾/提交事務的功能。

  • 能夠在單個事務中調用任意一組查詢。這也消除了需要擔心交易次數的問題。

  • 個人喜好:c#具有更優雅的結構來聲明交易:using塊。相比之下,我總是發現存儲過程中的事務在跳轉到回滾/提交時很麻煩。

我們可能有很多的驗證腳本這一切 內發生的事情,而我們並不需要一個開放的交易。我們需要在插入/更新/刪除之前打開一個事務 並且可以儘快關閉它。

這可能會也可能不會成爲問題,具體取決於打開了多少個事務(不清楚這是單個作業還是以高併發性運行的過程)。我會建議看看什麼鎖被放置在對象上,這些鎖持有多久。

請記住,可能的驗證應該鎖;如果數據在驗證時間和動作發生時間之間發生變化,該怎麼辦?

如果它的問題,您可以將違規程序分成兩個程序,並從TransactionScope以外呼叫一個程序。