四種隔離級別
innodb有四種標準的隔離級別
READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE.
默認隔離級別是REPEATABLE READ
用戶可以爲一個session中或所有的connection設置事務隔離級別屬性
innodb在不同的隔離級別下使用不同的鎖策略,使用默認的RR級別對ACID要求合規的重要數據可以基本滿足高度一致性。
如果對數據的一致性要求不高,可以使用較爲鬆式的策略,例如:RC、RU
innodb-SERIALIZABLE隔離級別是一種最嚴格的規則,一般用於XA事務或解決併發死鎖故障
RR級別
特性1.一致性讀的方式是在第一次讀時建立快照
特性2.在鎖定讀、update、delete時,加鎖方式依賴於查詢的方式,即是否是根據唯一索引查詢, 如果是則鎖定行,如果不是則可能會產生間隙鎖
RC級別:
特性1.一致性讀的方式是每次讀取和更新都會刷新快照
特性2.在鎖定讀、update、delete時,加鎖方式是隻鎖定索引記錄,不鎖間隙
特性3.在RC級別下binlog模式只支持row-based,即使配置了binlog_format=MIXED,實際也是採用row-based
特性4.在RC級別下,根據非索引字段更新,只會鎖定where條件下對應的行,不會鎖定全錶行記錄
在RC級別下,因爲沒有間隙鎖的保護,這時會出現幽靈問題,也可以叫做幻讀
RC級別作用和啓用innodb_locks_unsafe_for_binlog配置類似,但兩者也有區別:
1.innodb_locks_unsafe_for_binlog可以被設置成全局/所有session,但RC級別可以設置爲所有session/單個session
2.innodb_locks_unsafe_for_binlog只能在mysql服務啓動前設置,RC級別可以在服務運行時設置
RU級別:
特性.讀取不具有一致性,存在髒讀問題
SERIALIZABLE級別
特性.在atuocommit關閉的情況下,所有的select操作都會加共享鎖