之前學習的數(shù)據(jù)庫聲明式事務,放了很久很多東西都忘記了众眨,今天再次自己測試學習一下!
事務具有的四個特征ACID
原子性 | 事務里面的操作單元不可切割,事務中包含的各操作要么都做,要么都不做 |
---|---|
一致性 | 事務執(zhí)行前后,業(yè)務狀態(tài)和其他業(yè)務狀態(tài)保持一致 |
隔離性 | 多個事物之間不能互相干擾戈鲁, |
持久性 | 指一個事務一旦提交丧鸯,他對數(shù)據(jù)庫的改變是永久性的 |
Mysql的四種隔離級別
隔離級別 | 臟讀 | 不可重復讀 | 幻讀 |
---|---|---|---|
READ UNCOMMITTED | 有 | 有 | 有 |
READ COMMITTED | 無 | 有 | 有 |
REPEATABLE READ | 無 | 無 | 有(INNODB引擎已經(jīng)使用MVCC消除了幻讀問題) |
SERIALIZABLE | 無 | 無 | 無 |
- MySql默認隔離級別為REPEATABLE READ
臟讀:
[1]Transaction01將某條記錄的AGE值從20修改為30蛤铜。
[2]Transaction02讀取了Transaction01更新后的值:30。
[3]Transaction01回滾丛肢,AGE值恢復到了20围肥。
[4]Transaction02讀取到的30就是一個無效的值。
不可重復讀
[1]Transaction01讀取了AGE值為20蜂怎。
[2]Transaction02將AGE值修改為30穆刻。
[3]Transaction01再次讀取AGE值為30,和第一次讀取不一致杠步。
幻讀
[1]Transaction01讀取了STUDENT表中的一部分數(shù)據(jù)氢伟。
[2]Transaction02向STUDENT表中插入了新的行。
[3]Transaction01讀取了STUDENT表時幽歼,多出了一些行朵锣。
測試隔離級別
在READ UNCOMMITTED級別下的臟讀:
-
切換隔離級別:set session transaction isolation level read uncommitted;
- 第三步讀到了未提交的臟數(shù)據(jù)。
在READ COMMITTED級別下的不可重復讀:
-
切換隔離級別: set session transaction isolation level read committed;
- 左邊甸私,同一事物中诚些,第五步讀到的數(shù)據(jù)和第一、三步讀到的數(shù)據(jù)不一致皇型,不可重復讀問題诬烹。
在REPEATABLE READ級別,不會有其他問題:
-
切換隔離級別: set session transaction isolation level repeatable read;
- 這個級別下避免了臟讀和不可重復讀問題弃鸦,幻讀問題也通過INNODB的MVCC機制解決了绞吁。
在SERIALIZABLE級別:
- 確保一個事務可以多次從一個表中讀取到相同的行,在這個事務執(zhí)行期間唬格,禁止其它事務對這個表進行添加家破、更新、刪除操作西轩≡倍妫可以避免任何并發(fā)問題,但性能十分低下藕畔。