前言
? ? ????Mysql是一種關系型數據庫被被大家廣泛的使用百炬,而當它在高并發(fā)的情況下具钥,會產生一些臟讀、不可重復讀诊杆、幻讀等問題歼捐,可能網上博客介紹這種問題的文章也是遍地都是,但是還是想寫一篇加深印象和總結一下晨汹。
事務的特性
事務4大特性(ACID) :原子性豹储、一致性、隔離性淘这、持久性剥扣。
原子性:事務中的全部操作在數據庫中是不可分割的,要么全部完成铝穷,要么均不執(zhí)行.
一致性:幾個并行執(zhí)行的事務钠怯,其執(zhí)行結果必須與按某一順序串行執(zhí)行的結果相一致。
隔離性:事務的執(zhí)行不受其他事務的干擾曙聂,當數據庫被多個客戶端并發(fā)訪問時晦炊,隔離它們的操作,防止出現:臟讀宁脊、幻讀断国、不可重復讀。
持久性:對于任意已提交事務榆苞,系統(tǒng)必須保證該事務對數據庫的改變不被丟失稳衬。
事務的隔離級別
READ UNCOMMITTED:可以讀取未提交的數據,未提交的數據稱之為臟數據又稱之為臟讀坐漏,在RU模式下幻讀薄疚、不可重復讀和臟讀都是被允許的碧信。
READ COMMITTED:只能讀取已經提交的數據,幻讀和不可重復讀被允許街夭,不允許臟讀砰碴,RC級別解決了臟讀問題。
REPEATABLE READ:同一個事務中多次執(zhí)行同一個select讀取到的數據沒有變化(這時候就是解決了不可重復讀不可重復讀僅限于查詢)板丽,RR級別解決了不可重復讀衣式,但有幻讀的問題。
SERIALIZABLE:串行化在這個級別下幻讀、不可重復讀、臟讀都是不被允許的盈咳。
????????看起來是不是只要選擇串行化級別轰枝,什么異常讀取都不會發(fā)生,但是串行級別下會造成性能下降,串行化它會導致表級鎖,對所有的記錄都不能修改,而且不支持多個事務同時對一張表進行修改荧飞,查詢時沒問題的。
實踐環(huán)境
實踐mysql版本5.7.25名党,存儲引擎Innodb
RR級別的幻讀實踐
????????mysql設置當前會話的隔離級別為RR叹阔,set session transaction isolation level REPEATABLE READ
????????當第二個事務提交后,在第一個事務中是查詢不到id_text為2的數據传睹,但是在第一個事務中插入id_text為2的時候報主鍵重復異常耳幢,這就叫幻讀,明顯查詢不到但是修改時候卻告訴我數據存在欧啤。
????????這個級別下是不存在不可重復讀取的睛藻,可以驗證第三步和第五步查詢的數據是一致的,如果是不一致的將有不可重復讀的問題邢隧。
RU級別的臟讀實踐
????????mysql設置當前會話的隔離級別為RU店印,set session transaction isolation level READ UNCOMMITTED
????????要說mysql隔離級別哪種最可怕無非就是RU,因為它可以讀取別人未提交的數據簡稱臟讀倒慧,如果第一個事務正常的提交不出任何問題按摘,可能會正常,但是假如我進行Rollback操作纫谅,事務二讀取出來的數據就是臟數據炫贤,將會影響業(yè)務操作會造成意想不到的災難。
RC級別的不可重復讀實踐
????????mysql設置當前會話的隔離級別為RU系宜,set session transaction isolation level READ COMMITTED
????????不可重復讀的表現在同一個事務中照激,兩個相同的插敘語句查詢出來的數據不一致发魄,這是因為兩個查詢語句中間包含了其他事務的修改數據提交盹牧,導致第一次和第二次查詢數據不一致俩垃,它和臟讀的區(qū)別就是,它讀取的數據必須是事務執(zhí)行成功后的數據汰寓,而臟讀是讀取事務還沒進行提交的數據口柳。
????????在第六步和第八步就證明了臟讀和不可重復讀的區(qū)別,如果是臟讀第六步查詢出來的數據與第四步查詢的數據就不一致有滑。