mysql第三天 事務,mysql第三天
ACID
- A : 原子性 要麼全提交成功,要麼全失敗復原
- C:一致性 是從一個一致性狀態到另外一個一致性狀態。 意思就是說能量守恒。
還有的人理解其是外鍵的定義,即對於有班級的學生,不能建立一個不指定班級的學生
還有人認為一致性和原子性共同滿足了全好全壞的限定。
我認為在分散式資料庫中這個概念才更有意義,如何做到多幾點的一致性
- I:隔離性 跟隔離等級相關,通常來說,事物看不到其他未提交的事務的狀態
- D:持久性 事務一旦提交,所做的修改就是永久儲存的
隔離等級先看一下事務並行作業可能遇到的問題:
- 髒讀
A 修改資料,未提交。 B讀取到了A修改後的資料, 如果A提交失敗那麼該修改就不會生效因此就造成了B讀取到了髒資料。
- 不可重複讀取
A事務兩次讀取同一行資料,B事務在兩次之間修改了資料並提交,導致了A前後兩次讀取資料的不一致。
可以使用行鎖來解決,但是會減少效能,還可以使用MVCC策略解決
- 幻讀
A事務讀取範圍資料, B事務在範圍之間刪除或者新增了資料,A事務再次讀取該範圍時資料發生了變化。
可以使用間隙鎖解決,還可以使用MVCC策略,這樣可以減少阻塞。
mysql 中設定隔離等級
my.ini
#選擇性參數有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.[mysqld]transaction-isolation = REPEATABLE-READ
當前session
SELECT @@tx_isolation;set transaction isolation level read uncommitted;set transaction isolation level read committed; set transaction isolation level repeatable read; set transaction isolation level serializable;
再看看隔離等級對應解決了的問題
READ UNCOMMITED
//session1set autocommit = 0;set transaction isolation level read uncommitted;begin;update biz_pay_task set pin = 'test1' where id=1;// session 2set autocommit = 0;set transaction isolation level read uncommitted;select * from biz_pay_task where id=1;// session1,2rollback;
- 可以看到session2能夠讀取到未交的session1中的資料
- 因此上面三個問題都有可能發生
READ COMMITED
// session 1,2 set transaction isolation level read committed; // session 1update biz_pay_task set pin = 'test1' where id=1;// session 2select * from biz_pay_task where id=1;// session 1commit;// session 2select * from biz_pay_task where id=1;rollback;
- 可以看到session2隻能夠查看到sesssion1中已經提交了的變更。
- 避免了髒讀
- 很多資料庫預設都是這個層級
REPEATABLE READ
// session 1,2set transaction isolation level repeatable read; begin;// session 1update biz_pay_task set pin = 'test2' where id=1;commit;// session 2select * from biz_pay_task where id=1;rollback;begin;select * from biz_pay_task where id between 1 and 3;// session 1begin; delete from biz_pay_task where id=2;// session 2select * from biz_pay_task where id between 1 and 3;// session 1commit;// session 2select * from biz_pay_task where id between 1 and 3;rollback;
- session2事務開始後,session1所有的提交都對其沒有影響
- 可重複讀這個隔離等級避免了 不可重複讀取以及幻讀的問題。
- 幻讀問題本來並不是這個隔離等級能完成的,mysql通過mvcc的機制在這個隔離等級完成了
- 是mysql的預設隔離等級
SERIALIZABLE
強制事務順序執行
交易記錄
mysql使用交易記錄來提高寫的效能,不是每次都用隨機IO來寫硬碟,
而是先寫記憶體,記錄硬碟一小塊地區順序io的寫日誌
另外有線程把交易記錄回寫回資料區域硬碟
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。