[size=medium]在資料庫中,為了有效保證併發讀取資料的正確性,提出事務的隔離級別。
資料庫併發訪問可能出現的幾種情況:
①更新丟失(lost update):兩個事務同時更新一行資料,但第二個事務中途失敗退出,導致對資料的兩次修改都失效了。這是因為事務並沒有執行任何鎖的操作,用此併發事務並沒有被隔離開來。
②髒讀(dirty reads):乙個事務開始讀取了某行資料,但另乙個事務已經更新了此資料但沒有及時提交。這是相當危險的,可能造成所有的操作都被回滾。
③不可重複讀(non-repeatable reads):乙個事務對同一行資料讀取了兩次,卻得到了不同的結果。
它包括以下情況:
⑴事務t1讀取某一行資料後,事務t2對其進行了修改,當事務t1再次讀取該資料時,得到了不同的結果。
⑵幻讀(phantom reads):事務t1讀取某一批資料後,事務t2對其進行插入或刪除操作,當事務t1再次讀取資料時,發現裡面多了或是少了某些資料。
事務的隔離級別:
①未授權讀(tansaction_read_uncommitted):避免更新丟失,但允許髒讀。當乙個事務在進行寫的時候(雖然這時事務並未提交),另乙個事務則不能進行寫操作,但其他事務可以進行讀操作。通過「排他鎖」實現。
②授權讀(transaction_read_committed):避免髒讀,但允許不可重複讀。讀事務允許其他事務進行讀操作,但未提交的寫事務將禁止其他的讀、寫事務的操作。通過「瞬間共享鎖」和「排他鎖」實現。
③可重複讀(transaction_repeatable_read):避免髒讀和不可重複讀資料,允許幻影讀。當乙個事務在讀取某一行資料時,其他事務可以讀這行資料資料,但不允許寫(update/delete)這行資料。當乙個事務在寫(update/delete)某一行資料時,其他事務對這行資料既不能讀,也不能寫。通過「共享鎖」和「排他鎖」實現。
④序列化(trasaction_serializable):提供嚴格的事務隔離。它要求事務序列化執行,即:事務只能乙個接著乙個地執行,不能併發地執行。
* 隔離級別越高越能保證資料的完整性與一致性,但對併發的效能影響越大。對於多數的應用程式可以考慮把資料庫的隔離級別設為transaction_read_committed,他能避免髒讀,有很好的併發效能。雖然可能造成不可重複讀、幻讀和第二類更新丟失等情況,但可以通過樂觀鎖和悲觀鎖來控制。
悲觀鎖(pessimistic locking)
悲觀鎖是指假設併發更新衝突會發生,所以不管衝突是否真的發生,都會使用鎖機制。
悲觀鎖會完成以下功能:鎖住讀取的記錄,防止其它事務讀取和更新這些記錄。其它事務會一直阻塞,直到這個事務結束。悲觀鎖是在使用了資料庫的事務隔離功能的基礎上,獨享占用的資源,以此保證讀取資料一致性,避免修改丟失。
悲觀鎖可以使用repeatable read事務,它完全滿足悲觀鎖的要求。悲觀鎖的併發訪問性不好
樂觀鎖(optimistic locking)
樂觀鎖則認為其他使用者企圖改變你正在更改的物件的概率是很小的,因此樂觀鎖直到你準備提交所作的更改時才將物件鎖住,當你讀取以及改變該物件時並不加鎖。可見樂觀鎖加鎖的時間要比悲觀鎖短,樂觀鎖可以用較大的鎖粒度獲得較好的併發訪問效能。[/size]
資料庫事務隔離級別
資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable,這四個級別可以逐個解決髒讀 不可重複讀 幻讀這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted rea...
資料庫事務隔離級別
資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable,這四個級別可以逐個解決髒讀 不可重複讀 幻讀這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted rea...
資料庫事務隔離級別
資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable 這四個級別可以逐個解決髒讀 不可重複讀 幻讀 這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted re...