以下是我個人的理解,有不對的地方,還望博友指出哈。
在資料庫中,有4種不同的隔離級別供我們選擇,分別是read uncommited,read commited,repeatable read,serializable。
我來依依解釋這四種級別
第乙個,read uncommited,從名字上看,說的是,可以讀沒有提交的資料,那麼這個顯然是有很大的問題的,例如,我可以讀還沒有提交,但是已經更新或者插入或者刪除的資料,但是當某個時刻(還在read的事務內)以上這些操作都rollback了,那麼,讀出來的資料可能現在已經不是最新的狀態了,這樣就造成了髒讀,這顯然是不能接受的,所以,這個級別一般專案中是不會選擇的。讀取的交易不會阻止其它的交易,乙個未commit的交易會阻止其它寫入的交易。
第二個,read commited,這個意思是,乙個事務讀的資訊都是已經commited了的,讀不到沒有commited的,這樣在讀取一次時,不會造成髒讀,但是這個有個問題,就是如果我在讀取一次呢,這個時候如果有另外乙個事務,這個時候對讀取的資料進行了一些操作,並且提交了,那麼就很可能造成,第一次讀和第二次讀的資料不一致的情況,這就是所謂的,不可以重複讀,但是這個級別至少是可以保證它不會髒讀。讀取的交易不會阻止其它的交易,乙個未commit的交易會阻止其它所有的交易。
第三個,repeatable read,意思是說,可以重複讀,那麼這種的隔離級別要求,在讀取資料的時候,不允許在有對讀取資料進行寫入,那這個時候,就可以避免重複讀,讀取的交易不會阻止其它讀取的交易,但會阻止其它寫入的交易,而寫入的交易會阻止所有其它的交易。但是這個時候,我可以對這條資料進行刪除,那麼這個時候,就可能產生幻讀,我實際上是讀對了,但是由於後續的一些操作,導致我讀出來的資料有問題,就是幻讀。
最後乙個serializable,這個從字面上解釋,就是說的,序列化,也就是說,每乙個事務的開始,都必須在前乙個事務結束後執行,他們是序列的,不是並行的,那麼這個時候,上面所有的問題都可以解決,不會造成髒讀,重複讀,幻讀
Mysql隔離級別的理解
1 read uncommitted 讀取未提交 查詢時可以查詢到沒有提交的資料,導致髒讀 2 read committed 讀取提交內容 前一次查詢和後一次查詢中資料間有被增刪改,導致查詢資料不一致,導致不可重複讀,但不能讀取到未提交的資料 3 repeatable read 可重複讀 會導致幻讀...
事務隔離級別的理解
資料庫事務的隔離級別有4種,由低到高分別為read uncommitted read committed repeatable read serializable 而且,在事務的併發操作中可能會出現髒讀,不可重複讀,幻讀。下面通過事例一一闡述它們的概念與聯絡。read uncommitted 讀未提...
對SQL事務隔離級別的簡單理解
資料庫事務 database transaction 是指作為單個邏輯工作單元執行的一系列操作。事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向資料的資源。通過將一組相關操作組合為乙個要麼全部成功要麼全部失敗的單元,可以簡化錯誤恢復並使應用程式 更加可靠。乙個邏輯工作單元要...