事務隔離性的一些基礎知識 在SQL 2000中是講究事務隔離級别的,分為以下幾種:(符合SQL 92中定義的事務隔離級别) [1] READ UNCOMMITTED [2] READ COMMITTED [3] REPEATABLE READ [4] SERIALIZABLE 其中要特别注意[4],也就SERIALIZABLE,這個才和我們在資料庫原理中學的那個”I”含義一緻呢。 那其它的那些隔離級别又是幹什麼的呢?讓我們先了解以下幾個概念:髒讀,不可重複讀,幻像。 [1] 髒讀: 所謂髒讀,就是讀了未送出的資料。舉個例子:B事務讀取了A事務尚未commit的資料,不巧的是,之後A事務rollback了,這就叫髒讀。 [2] 不可重複讀: 所謂不可重複讀,就是一個事務多次讀取某一行,但是這一行在多次讀取之中的值不一緻(這個事務并為對這行作任何修改操作)。舉例:A事務多次讀取某一行,在它多次讀取操作之間,B事務修改了這一行,這就是不可重複讀。 [3] 幻像: 所謂幻像,在一個尚未送出的事務的讀取的行的範圍中插入新行或删除現有行。舉例:B事務對A事務讀取的行範圍内插入新行或删除行,而A事務之後還會通路這些行(即操作會受到這些行的影響),這樣A事務中就發生了幻像。 好了,現在我們就可以明确隔離級别中[1]~[4]的含義了:
是否可以髒讀 | 是否可以不可重複讀 | 是否出現幻像 | |
READ UNCOMMITTED | Y | Y | Y |
READ COMMITTED | N | Y | Y |
REPEATABLE READ | N | N | Y |
SERIALIZABLE | N | N | N |
此表表明了從[1]~[4]隔離性逐漸增強,而并發性逐漸減弱,至于應該取用那種隔離級别,就和實際情況有關了。我之前項目中犯的錯誤就是以為預設就是SERIALIZABLE,而其實在SQL2000中預設是READ COMMITTED。