提到事務,你肯定不陌生,和資料庫打交道的時候,我們總是會用到事務。最經典的例子就是轉賬,你要給朋友小王轉 100 塊錢,而此時你的銀行卡只有 100 塊錢。轉賬過程具體到程式裡會有一系列的操作,比如查詢餘額、做加減法、更新餘額等,這些操作必須保證是一體的,不然等程式查完之後,還沒做減法之前,你這 100 塊錢,完全可以藉著這個時間差再查一次,然後再給另外乙個朋友轉賬,如果銀行這麼整,不就亂了麼?這時就要用到「事務」這個概念了。
簡單來說,事務就是要保證一組資料庫操作,要麼全部成功,要麼全部失敗。在 mysql 中,事務支援是在引擎層實現的。你現在知道,mysql 是乙個支援多引擎的系統,但並不是所有的引擎都支援事務。比如 mysql 原生的 myisam 引擎就不支援事務,這也是 myisam 被 innodb 取代的重要原因之一。
提到事務,你肯定會想到 acid(atomicity、consistency、isolation、durability,即原子性、一致性、隔離性、永續性),今天我們就來說說其中 i,也就是「隔離性」。
當多事務同時執行的時候,可能會出現的問題:髒讀、不可重複讀、幻讀此情況僅會發生在: 讀未提交的的隔離級別.
此情況僅會發生在:讀未提交、讀提交的隔離級別.
幻讀是指當事務不是獨立執行時發生的一種現象,例如第乙個事務對乙個表中的資料進行了修改,比如這種修改涉及到表中的「全部資料行」。同時,第二個事務也修改這個表中的資料,這種修改是向表中插入「一行新資料」。那麼,以後就會發生操作第乙個事務的使用者發現表中還存在沒有修改的資料行,就好象發生了幻覺一樣.
一般解決幻讀的方法是增加範圍鎖ranges,鎖定檢索範圍為唯讀,這樣就避免了幻讀。
此情況會回發生在:讀未提交、讀提交、可重複讀的隔離級別.
不同事務隔離級別的區別:
讀未提交:乙個事務還未提交,它所做的變更就可以被別的事務看到
讀提交:乙個事務提交之後,它所做的變更才可以被別的事務看到
可重複讀:乙個事務執行過程中看到的資料是一致的。未提交的更改對其他事務是不可見的
序列化:對應乙個記錄會加讀寫鎖,出現衝突的時候,後訪問的事務必須等前乙個事務執行完成才能繼續執行
其實另一種理解就是
讀未提交:別人改資料的事務尚未提交,我在我的事務中也能讀到。
讀已提交:別人改資料的事務已經提交,我在我的事務中才能讀到。
可重複讀:別人改資料的事務已經提交,我在我的事務中也不去讀。
序列:我的事務尚未提交,別人就別想改資料。
這4種隔離級別,並行效能依次降低,安全性依次提高。
MySQL事務 隔離性中的隔離級別
建表 create table student id int primary key,name varchar 100 engine innodb charset utf8 測試資料 insert into student values 1 張三 如果乙個事務讀到了另乙個未提交事務修改過的資料,那麼...
mysql隔離級別 MySQL 事務隔離級別
mysql innodb所提供的事務滿足acid的要求,事務是通過事務日誌中的redo log和undo log來實現原子性 undo log 一致性 undo log 永續性 redo log 事務通過鎖機制實現隔離性。1 事務隔離級別與實現read uncommitted 讀未提交 read c...
mysql隔離級別驗證 mysql 隔離級別測試
1 設定隔離級別,包括 全域性 global.tx isolation,會話級別 session.tx isolation mysql workbench的會話 2 建立測試表 注意 unsigned auto increment primary key用法 預設引擎的設定 建立測試表 use te...