2011-05-12 90 views
33

我不常使用存儲過程,並想知道是否有意義在事務中包裝我的select查詢。使用事務處理select語句?

我的程序有三個簡單的選擇查詢,其中兩個使用第一個的返回值。

回答

34

在一個高度併發的應用程序中,它可能(理論上)發生在第一個選擇中讀取的數據在其他選擇被執行之前被修改。

如果這是您的應用程序中可能發生的情況,您應該使用事務來包裝您的選擇。確保你選擇了正確的isolation level,但不是所有的事務類型都能保證一致的讀取。

更新: 您也可以找到併發更新/插入解決方案this article(又名UPSERT)有趣。它提出了幾種常用的upsert測試方法,以查看實際使用的方法保證數據在select和next語句之間未被修改。結果是令人震驚的,我會說。

+0

我使用服務代理與高度併發服務與類似的情況下,並有高死亡率下的SQL死鎖問題。 應用這個建議和**特別是**上面提到的[文章](http://michaeljswart.com/2011/09/mythbusting-concurrent-updateinsert-solutions/)修復了所有的僵局 - 謝謝:-) – Sia 2016-09-20 21:04:37

2

通常在插入,更新或刪除語句時使用事務,並且您希望具有原子行爲,即提交每個事物或不提交任何內容。但是,您可以使用select語句的事務來確保沒有其他人可以在執行大量選擇查詢時更新感興趣的表。

看看這個msdn post

+2

你讀過你的鏈接了嗎? '應用程序可以執行操作,例如獲取鎖以保護SELECT語句的事務隔離級別'這是一個很好的用例,因爲OP聲明他們在後續查詢中使用一個select的結果作爲參數。 – JNK 2011-05-12 18:31:24