面試白話文,事務隔離級別
事務具有原子性、一致性、隔離型、持久性。
使用Mysql數據庫說明事務隔離級別:
mysql支持事務的常用引擎是InnoDB
mysql默認事務隔離級別可重復讀(REPEATABLE-READ):使用show variables like 'tx_isolation' 查看
注:以下第二個事務,處於開啟,未提交狀態。
第一種:讀未提交(read uncommitted)
第一個事務未提交更新的數據,第二個事務可以讀到,這是讀未提交。
第一個事務未提交更新的數據回滾,第二個事務讀到回滾的數據,這是臟讀。
故讀未提交,可能會出現臟讀。
第二種:讀已提交(read committed),也稱不可重復讀
第一個事務未提交更新的數據,第二個事務讀不到;
第一個事務提交更新的數據,第二個事務可以讀到;這是讀已提交。
第一個事務提交更新小明同學年齡12歲,第二個事務讀到小明12歲;
第三個事務再次提交更新小明同學年齡14歲,第二個事務再讀到小明14歲;這是不可重復讀(同一個事務內讀取的數據結果不一致)。
故讀已提交,會出現不可重復讀(同一個事務內讀取的數據結果不一致),不可重復讀也會造成幻讀(同一個事務內讀取的數據結果不一致)。
第三種:可重復讀(repeatable read),mysql默認事務隔離級別
第一個事務提交更新小明同學年齡12歲,第二個事務讀到小明12歲;
第三個事務再次提交更新小明同學年齡14歲,第二個事務再讀到小明12歲;這是可重復讀(同一個事務內讀取的數據結果一致)。
第四個事務提交插入同學小馬數據記錄,第二個事務再讀不僅讀到小明12歲數據,還會讀到小馬同學數據,這是幻讀。
故可重復讀,會出現幻讀(同一個事務內讀取的數據結果不一致)。
第四種:串行化(serializable)
隔離級別最高,解決了臟讀、不可重復無、幻讀問題。
同一個事務內,不管讀取多少次,結果集永遠一致。