2009年2月9日 星期一

一個好的sql Transaction 教學文章 參考

http://www.codeproject.com/KB/database/transactions.aspx


  • Read Uncommitted

也稱為"dirty read",某個交易可以讀取到其他交易正在修改的資料,一般 flat-file 的資料庫,像是 DBASE, Paradox 等都只支援這個等級。這個等級在多使用者同時上線進行交易時會發生衝突的機率最低,所以 concurrency(並行性)最佳,但是 consistency(資料的一致性)最差。
  • Read Committed

只能讀取已經 commit 的資料。當某個交易欲讀取的資料正被其他交易修改時,就必須等到其他交易釋放其對資料的寫入鎖定以後才能進行讀取動作。

  • Repeatable Read

這個等級會讓 read lock 一直持續直到交易結束,以確保你在交易中讀取的資料會一直維持不變(和資料庫裡面的資料一樣),不會被其他交易修改。
  • Serializable

這是最嚴格的隔離等級,它有一個特色,就是交易進行時不允許"幽靈資料"的產生,例如,當一筆交易執行 select count(*) 的 SQL 命令以取得某資料表的記錄筆數時,其他的交易便無法新增任何記錄到這個資料表。資料庫系統通常以 table lock 或 index range lock 避免幽靈資料的產生,也因此這個等級的 consistency 最佳,但是 concurrency 卻最差,當同時要處理的交易很多時就很容易塞車甚至出車禍。
Isolation 就是隔離或隱藏尚未交付(commit)的交易以避免各交易之間相互影響,通常是透過資料庫的鎖定機制來達成,那我們又得先來了解一下什麼是鎖定。大部分的資料庫都會提供兩種鎖定:讀取鎖定(read lock)與寫入鎖定(write lock),當資料被讀取時會產生 read lock,此時其他交易仍然可以讀取這些資料,但是不可以修改(其他交易無法對一個已經被 read lock 的記錄進行 write lock);當資料被修改時會產生 write lock,此時其他交易必須等到取得 write lock 的交易 commit 或 rollback 之後才能對該資料進行讀取及寫入動作。剛才這一長串好像繞口令的文字敘述其實可以整理成下面這兩句話
Read lock 不會排斥 read lock,但會排斥 write lock(共享鎖定)。
Write lcok 會排斥 read lock 與 write lock(獨占鎖定)。

沒有留言:

張貼留言