css動畫總結
隔離級別:
分為:
1.讀未提交;2.讀已提交;3.可重複讀;4.序列劃
資料庫會出現的問題:1.髒讀;2.不可重複讀;3.幻讀
不同隔離級別,能處理的問題不同:
那來看看下面一些概念:
髒讀:指的是一個事務讀取到了另一個事務未提交的更新資料:
===session1=== SELECT @@tx_isolation; SET tx_isolation='READ-UNCOMMITTED'; BEGIN; insert into students(`name`,age,teacherId) VALUES ('takey123',25,1) ROLLBACK; COMMIT; ===session2=== SET tx_isolation='READ-UNCOMMITTED'; SELECT * FROM students
說明:事務1,設定隔離級別為讀未提交。然後開啟事務,insert一條記錄,但是不提交。
此時事務2,查詢到了所有資料,包扣事務1插入但是還沒提交的資料,假如做了sum()運算。這是事務1回滾事務。這樣就出問題了。事務2的資料並不是準確的。
為了避免這種情況,只能設定更高的隔離級別
不可重複讀:一個事務多次讀取同一資料返回的結果不同,換句話說,後續讀取可以讀到另一個事務已提交的更新資料。
相反, “可重複讀”在同一事務中多次讀取資料時, 能夠保證所讀資料一樣, 也就是後續讀取不能讀到另一事務已提交的更新資料。
事務B修改資料導致當前事務A前後讀取資料不一致 ,側重點在於事務B的修改
===session1=== SELECT @@tx_isolation; SET tx_isolation='READ-COMMITTED'; BEGIN; SELECT * FROM students SELECT * FROM students COMMIT; ===session2=== SET tx_isolation='READ-COMMITTED'; UPDATE students SET age=25 WHERE `name`='min';
說明:事務1第一次讀取資料表,獲取學生的年齡是25歲。此時事務2對該學生的年齡修改為40並提交。
事務1第二次讀取資料表,獲取學生的年齡是40歲。這就出現了同一事務多次讀取到的資料不一致,導致不可重複讀。
幻讀:查詢表中資料如果沒有存在就插入一條資料。在併發的時候,裡面會出現2條一樣的資料。
事務A在查詢資料庫是,發現沒有此資料,就去插入一條資料,但是此時事務B也是查詢不到資料去插入一條資料並插入成功了。
如果事務A此時再去查的時候,發現了有這條資料,就感覺出現了幻覺,明明自己還沒插入,但是又出現了這條資料。
===session1=== SELECT @@tx_isolation; SET tx_isolation='REPEATABLE-READ'; BEGIN; SELECT * from students WHERE `name`='takey123'; #此時,另一個事務插入了資料 SELECT * from students WHERE `name`='takey123'; insert into students(`name`,age,teacherId) VALUES ('takey123',25,1) SELECT * from students WHERE `name`='takey123'; UPDATE students SET age=40 WHERE `name`='takey123'; SELECT * from students WHERE `name`='takey123'; COMMIT; ===session2=== SET tx_isolation='REPEATABLE-READ'; insert into students(`name`,age,teacherId) VALUES ('takey123',25,1)
說明:事務1,插入資料庫中是否存在資料,如果不存在的時候去插入這條資料,但是在查詢不存在的時候,事務2,插入了該條資料,
事務1也插入該條資料,導致資料庫中有2條一模一樣的資料。這就產生了幻讀。