2011-01-28 83 views
0

在SQL服務器2005中,我們應該使用哪種數據庫隔離級別以及哪種隔離級別最好?

我有這麼多的存儲過程,一些用於事務的更新表記錄,一些用於獲取表記錄。

當一個SP正在調用一個正在更新表記錄的瀏覽器時,如果我運行另一個用於getiing表數據的SP,那麼它應該在不等待的情況下運行,我需要做什麼?

哪個數據庫隔離,我們應該使用相同的,並且隔離級別是最好的?

它可以poosible與「transalation快照隔離級別」。但它會在Teampdb數據庫中選擇舊的快照數據,這可能會降低性能。

你的建議是什麼?

回答

1

READ COMMITTED是SQL Server默認的事務隔離級別。

使用其他隔離級別的(對我來說,反正)構成code smell —對我來說,至少—需要一些真正的理由,而在某些情況下使用有限的READ UNCOMMITTED可能是個例外。

+0

+1:如果你不得不問... – 2011-01-28 20:17:58

0

如果某些表第一個事務更新的數據,然後第二個會等待無論如何得到這個數據(除了讀取未提交的隔離級別,但在這種情況下,你可以有非常不一致的數據)。

1

您應該使用SNAPSHOT隔離級別。最好的方法是在數據庫級別打開READ COMMITTED SNAPSHOT,這會默認將所有默認的READ COMMITTED事務轉換爲快照事務。

爲什麼快照是最好的應用程序,專爲能碰上由於阻塞併發的問題,應用的原因,是無數的,而利益是無窮無盡的。確實SNAPSHOT隔離發生在cost in resources used,但除非您測量並找到確實的證據,即導致問題的行版本存儲,否則您不能提前解僱。

一個不應該使用的隔離級別是UNCOMMITTED。這是在尋求麻煩。 Dirty reads are inconsistent reads

重複和SERIALIZABLE具有極其狹窄的使用情況,您將最有可能永遠需要他們。不幸的是SERIALIZABLE被.Net System.Transactions和MTS/COM +所濫用,所以很多應用程序最終都會使用它(並且因爲它有巨大的可伸縮性問題),儘管這不是必需的。