讀未提交(Read uncommitted),就是一個事務能夠看到其他事務尚未提交的修改,這是最低的隔離水平,允許髒讀出現。讀已提交(Read committed),事務能夠看到的數據都是其他事務已經提交的修改,也就是保證不會看到任何中間性狀態,當然髒讀也不會出現。
讀已提交仍然是比較低級別的隔離,並不保證再次讀取時能夠獲取同樣的數據,也就是允許其他事務併發修改數據,允許不可重複讀和幻象讀(Phantom Read)出現。
可重複讀(Repeatable reads),保證同一個事務中多次讀取的數據是一致的,這是 MySQL InnoDB 引擎的默認隔離級別,但是和一些其他數據庫實現不同的是,可以簡單認爲 MySQL 在可重複讀級別不會出現幻象讀。
串行化(Serializable),併發事務之間是串行化的,通常意味着讀取需要獲取共享讀鎖,更新需要獲取排他寫鎖,如果 SQL 使用 WHERE 語句,還會獲取區間鎖(MySQL 以 GAP 鎖形式實現,可重複讀級別中默認也會使用),這是最高的隔離級別。
三個範式:
ORM框架原理:
索引相關: