-
什么是事務?
-
事務的4大特性
-
???原子性指事務所包含的操作要么全部成功,要么全部失敗回滾。
-
???隔離性是指當多個用戶并發(fā)操作數(shù)據(jù)庫的時候仆潮,為每個用戶開啟的事務愧哟,不影響其他事務靴庆,多個事務之間相互隔離讲逛。
-
???事務開始前和結束后,數(shù)據(jù)的完整性約束沒有被破壞店诗。
???事務一旦被提交裹刮,對數(shù)據(jù)庫中的改變是永久性的,即使是在數(shù)據(jù)庫系統(tǒng)遇到故障的情況下也不會丟失提交事務的操作庞瘸。
-
并發(fā)事務帶來的問題
- 臟讀: ???? 如果有兩個事務A,B. A事務先開始捧弃,對數(shù)據(jù)做了修改但是沒有提交,此時B事務開始擦囊,讀取到了A事務修改但未提交的事務违霞,那么B事務讀取到的數(shù)據(jù)根本是不被承認的,此時B讀取到的數(shù)據(jù)為臟數(shù)據(jù)瞬场。
- 不可重復度: ???? 事務A多次讀取同一數(shù)據(jù)买鸽,事務B在事務A多次讀取之后,對數(shù)據(jù)做了更改贯被,導致事務A在下次讀取數(shù)據(jù)的時候眼五,與上次讀取的數(shù)據(jù)結果不一致妆艘。
-
幻讀: ????A事務讀取B事務提交的新增數(shù)據(jù),這是A事務出現(xiàn)幻讀看幼。
小結:
-
事務的隔離級別有哪些?Mysql的默認隔離級別是批旺?
事務級別 | 描述 | 臟讀 | 不可重復讀 | 幻讀 |
---|---|---|---|---|
READ-UNCOMMITTED(讀取未提交) | 最低的隔離級別,允許讀取尚未提交的數(shù)據(jù)變更 | Y | Y | Y |
READ-COMMITTED(讀取已提交) | 允許讀取并發(fā)事務讀取已經提交的事務 | N | Y | Y |
REPEATABLE-READ(可重復讀) | 對同一字段的多次讀取結果是一致的诵姜,除非數(shù)據(jù)是被事務自身修改 | N | N | Y |
SERIALIZABLE(可串行化) | 最高的隔離級別朱沃,完全符合AICD,所有事務逐個執(zhí) | N | N | N |
Mysql InnoDB 存儲引擎的默認隔離級別是REPEATABLE-READ茅诱。
mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)
mysql>
: mysql的REPEATABLE-READ的事務級別是使用的Next-Key Lock鎖算法,因此可以避免幻讀的發(fā)生搬卒。
補充:
可以通過 set session transaction isolation level
設置事務的隔離級別
mysql> set session transaction isolation level read committed;
Query OK, 0 rows affected (0.00 sec)
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> update student_score set score=99 where id=26;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> commit;
Query OK, 0 rows affected (0.04 sec)