事務(wù)的基本要素
- 原子性(Atomicity):事務(wù)開(kāi)始后所有操作逝段,要么全部做完,要么全部不做议街,不可能停滯在中間環(huán)節(jié)泽谨。事務(wù)執(zhí)行過(guò)程中出錯(cuò),會(huì)回滾到事務(wù)開(kāi)始前的狀態(tài),所有的操作就像沒(méi)有發(fā)生一樣隔盛。也就是說(shuō)事務(wù)是一個(gè)不可分割的整體,就像化學(xué)中學(xué)過(guò)的原子拾稳,是物質(zhì)構(gòu)成的基本單位吮炕。
- 一致性(Consistency):事務(wù)開(kāi)始前和結(jié)束后,數(shù)據(jù)庫(kù)的完整性約束沒(méi)有被破壞 访得。比如A向B轉(zhuǎn)賬龙亲,不可能A扣了錢,B卻沒(méi)收到悍抑。
- 隔離性(Isolation):同一時(shí)間鳄炉,只允許一個(gè)事務(wù)請(qǐng)求同一數(shù)據(jù),不同的事務(wù)之間彼此沒(méi)有任何干擾搜骡。比如A正在從一張銀行卡中取錢拂盯,在A取錢的過(guò)程結(jié)束前,B不能向這張卡轉(zhuǎn)賬记靡。
- 持久性(Durability):事務(wù)完成后谈竿,事務(wù)對(duì)數(shù)據(jù)庫(kù)的所有更新將被保存到數(shù)據(jù)庫(kù),不能回滾摸吠。
MySQL的支持
MySQL只在InnoDB中支持事務(wù)
四種隔離級(jí)別
- 未提交讀(uncommitted read)
- 提交后讀(committed read)
- 可重復(fù)讀(repeatable read)
- 串行化(serializable read)
隔離說(shuō)明
隔離級(jí)別 | 臟讀 | 不可重復(fù)度 | 幻讀 |
---|---|---|---|
讀未提交(read-uncommitted) | 是 | 是 | 是 |
讀已提交(read-committed) | 否 | 是 | 是 |
可重復(fù)讀(repeatable-read) | 否 | 否 | 是 |
可串行化(serializable) | 否 | 否 | 否 |
- 臟讀(duty read):讀到?jīng)]有提交的事務(wù)提交的數(shù)據(jù)
- 不可重復(fù)讀(unrepeatable read):在一個(gè)事務(wù)內(nèi)空凸,讀到的同一條數(shù)據(jù)可能不一樣
- 幻讀(dream read):事務(wù)A 按照一定條件進(jìn)行數(shù)據(jù)讀取, 期間事務(wù)B 插入了相同搜索條件的新數(shù)據(jù)寸痢,事務(wù)A再次按照原先條件進(jìn)行讀取時(shí)呀洲,發(fā)現(xiàn)了事務(wù)B 新插入的數(shù)據(jù) 稱為幻讀
實(shí)驗(yàn)
環(huán)境:Win7+MySQL5.7
mysql> desc test;
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | YES | | NULL | |
+-------+--------------+------+-----+---------+----------------+
2 rows in set (0.09 sec)
mysql> SELECT * FROM test;
+----+-------------------+
| id | name |
+----+-------------------+
| 1 | asdasd123123adasd |
+----+-------------------+
1 row in set (0.00 sec)
讀未提交
事務(wù)A
Query OK, 0 rows affected (0.00 sec)
mysql> select * from test where id =1;
+----+-------------------+
| id | name |
+----+-------------------+
| 1 | asdasd123123adasd |
+----+-------------------+
1 row in set (0.00 sec)
事務(wù)B
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> update test set name="test_b" where id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
事務(wù)A
mysql> select * from test where id = 1;
+----+--------+
| id | name |
+----+--------+
| 1 | test_b |
+----+--------+
1 row in set (0.00 sec)
結(jié)論
- 事務(wù)A在事務(wù)中兩次查詢數(shù)據(jù)不一樣
- 事務(wù)B還未提交,事務(wù)A的結(jié)果已經(jīng)變化
- 未提交讀是臟讀
讀后提交
事務(wù)A
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from test where id = 1;
+----+-------------------+
| id | name |
+----+-------------------+
| 1 | asdasd123123adasd |
+----+-------------------+
1 row in set (0.00 sec)
事務(wù)B
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> update test set name="test_b" where id = 1;
Query OK, 1 row affected (0.05 sec)
Rows matched: 1 Changed: 1 Warnings: 0
事務(wù)A
mysql> select * from test where id = 1;
+----+-------------------+
| id | name |
+----+-------------------+
| 1 | asdasd123123adasd |
+----+-------------------+
1 row in set (0.00 sec)
事務(wù)B
mysql> commit;
Query OK, 0 rows affected (0.07 sec)
事務(wù)A
mysql> select * from test where id = 1;
+----+--------+
| id | name |
+----+--------+
| 1 | test_b |
+----+--------+
1 row in set (0.00 sec)
結(jié)論
- 事務(wù)A在事務(wù)B執(zhí)行更新語(yǔ)句后查詢結(jié)果一致
- 事務(wù)A在事務(wù)B提交后查詢結(jié)果改變
- 提交后讀是不可重復(fù)讀的
可重復(fù)讀
事務(wù)A
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from test where id = 1;
+----+--------+
| id | name |
+----+--------+
| 1 | test_a |
+----+--------+
1 row in set (0.00 sec)
事務(wù)B
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> update test set name="test_b" where id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
事務(wù)A
mysql> select * from test where id = 1;
+----+--------+
| id | name |
+----+--------+
| 1 | test_a |
+----+--------+
1 row in set (0.00 sec)
事務(wù)B
mysql> commit;
Query OK, 0 rows affected (0.06 sec)
事務(wù)A
mysql> select * from test where id = 1;
+----+--------+
| id | name |
+----+--------+
| 1 | test_a |
+----+--------+
1 row in set (0.00 sec)
結(jié)論
- 事務(wù)A中的查詢結(jié)果在事務(wù)B提交前后都不會(huì)變化
- 可重復(fù)讀-可重復(fù)讀
幻讀問(wèn)題
上圖能出現(xiàn)幻讀
總結(jié)
隔離級(jí)別中沒(méi)有試驗(yàn)系列化啼止,個(gè)人覺(jué)著意義不大道逗,上述試驗(yàn)?zāi)苷f(shuō)明,隔離級(jí)別已經(jīng)能深刻的說(shuō)明問(wèn)題献烦,加油