隔離性要求乙個事務對資料庫中資料的修改,在未提交完成前對於其他事務是不可見的。
sql標準中定義了四種隔離級別:
下面來詳細說明一下這四種隔離級別。
在未提交讀這種隔離級別中,對資料的修改,即使還未提交,對其他的事務也是可見的。事務可以讀取未提交的資料,也稱之為「髒讀」,讀到的資料被稱之為「髒資料」。未提交之前,資料是不準確的,可能會被回滾,也可能還有後續操作的變化。
之前在使用sqlserver時,經常會建議,查詢的時候在from子句加上with(nolock)。這個關鍵字的作用就是進行髒讀。這是由於在老版本的sqlserver中,是不支援非鎖定讀的。現在在新版本的sqlserver中可以進行非鎖定讀了。允許髒讀可能產生較多的併發操作,但其代價是讀取以後會被其他事務回滾的資料修改。
舉個栗子:老闆給員工發工資,實際發6千,一手抖按了9千,這時員工賬戶的資料已經發生了更改,但是事務還沒提交。員工一查,自己多了3千塊錢,以為是漲工資了,過去謝謝老闆。老闆一看不對啊,我按錯了,回滾事務,重新給發6千。小伙紙欲哭無淚。
這個隔離級別是大多數作業系統的預設隔離級別,也是平時用的最多的隔離級別。常見的oracle、sqlserver等,但是mysql是個例外,mysql的預設隔離級別是可重複讀。已提交讀滿足前面隔離性的簡單定義。乙個事務對資料所作的修改,只有到提交之後才能看到。
舉個栗子:老闆給員工發工資,老闆說,我已經給你們發工資了啊,你們查查。然後一眾人員一查賬戶餘額都是0 。當轉賬的事務沒有走完的時候,查詢出來是沒有發生變化的資料。過一會轉賬事務完成,員工再一查工資,果然到賬了。
該級別保證了在同乙個事務中多次讀取同樣的記錄的結果是一致的。相比與可重複讀這個隔離級別,已提交讀又稱為不可重複讀。這兩個隔離級別有什麼區別呢,下面就通過乙個例子展示一下。
首先我們建立兩個資料庫連線
首先切換資料庫為test,在這個庫中我建立了乙個簡單的表 t,裡面就這些數字。
我們來看一下這個表的隔離級別是什麼,使用下面這個命令。可以看到,當前的隔離級別是可重複讀
我們開啟兩個事務,在其中乙個事務中進行查詢,另乙個事務進行插入操作。
事務1
事務2
這裡兩個事務都未提交,首先在事務1中進行查詢操作,查詢小於7的記錄,可以查到1、3、5三條記錄。之後再事務2中做了insert操作,插入了記錄 2 ,然後再去事務1中查詢,顯示結果還是1、3、5。然後我們提交一下事務2,可以看到事務1查詢出來還是1、3、5。這個事務級別就是可重複讀,即使其他事務已經提交,但這個事務中讀到的資料還是原先的資料。
如果是已提交讀,那麼在事務2提交之後,事務1進行查詢就會是最新的資料。
序列化是最高的隔離級別。序列化會在讀取的每一行上都加鎖,所以可能會導致大量的鎖超時和鎖爭用問題。在實際業務中我們很少使用這個隔離級別。除非是嚴格要求資料一致性,並且可以接受在沒有併發的前提下,我們才會考慮使用這種隔離級別。
這四種隔離級別隔離性從低到高分別是:未提交讀、已提交讀、可重複讀、可序列化。
併發性跟隔離性恰好相反,從低到高是:可序列化、可重複讀、可重複讀、未提交讀。
這也非常好理解,隔離性越高,說明鎖的粒度越細。併發性自然就會降低。好比家裡有大門、裡屋門、櫃子門。如果全都加鎖,我取完東西在把鑰匙給下乙個人。這樣隔離級別高,但是操作效率肯定慢。反過來,如果都不加鎖,大家不用等待鑰匙,就可以同時操作乙個櫃子。併發性高,但是取到的東西就會有些亂。
mysql的預設隔離級別是可重複讀,不是讀已提交。
mysql隔離級別 MySQL 事務隔離級別
mysql innodb所提供的事務滿足acid的要求,事務是通過事務日誌中的redo log和undo log來實現原子性 undo log 一致性 undo log 永續性 redo log 事務通過鎖機制實現隔離性。1 事務隔離級別與實現read uncommitted 讀未提交 read c...
MySQL事務隔離級別
sql標準定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低階別的隔離級一般支援更高的 併發處理,並擁有更低的系統開銷。read uncommitted 讀取未提交內容 在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,...
Mysql 事務隔離級別
mysql 5.5預設儲存引擎 表型別 使用的是innodb,它是支援acid特性的 acid,指資料庫的原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 乙個支援事務 transaction 的資料庫系統,必需要具有這四種特性,否...