1. 事務(wù)的4大特性 | ACID
參考1:https://www.runoob.com/mysql/mysql-transaction.html
原子性
Atomicity
:也稱不可分割性姥份。一個(gè)事務(wù)是一個(gè)不可分割的工作單位谤狡,原子性側(cè)重于狀態(tài),事務(wù)中包括的操作要么都做聂儒,要么都不做菊值,不存在只有部分做了的狀態(tài)抄淑。一致性
Consistency
:事務(wù)必須是數(shù)據(jù)庫(kù)從一個(gè)一致性狀態(tài)變到另一個(gè)一致性狀態(tài)。一致性與原子性是密切相關(guān)的馋记,一致性側(cè)重于可見(jiàn)性号坡,只有最初狀態(tài)和最終狀態(tài)的數(shù)據(jù)對(duì)外可見(jiàn),而中間狀態(tài)(事務(wù)沒(méi)有結(jié)束)的數(shù)據(jù)對(duì)外部不可見(jiàn)梯醒。隔離性
Isolation
:一個(gè)事務(wù)的執(zhí)行不能被其他事務(wù)干擾宽堆。即一個(gè)事務(wù)內(nèi)部的操作及使用的數(shù)據(jù),對(duì)并發(fā)的其他事務(wù)是隔離的茸习,并發(fā)執(zhí)行的各個(gè)事務(wù)之間不能互相干擾畜隶。持久性
Durability
:也稱永久性。一個(gè)事務(wù)一旦提交逮光,它對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的改變就應(yīng)該是永久性的代箭。接下來(lái)的其他操作或故障不應(yīng)該對(duì)其有任何影響。
注意:1.原子性和一致性的的側(cè)重點(diǎn)不同:原子性關(guān)注狀態(tài)涕刚,要么全部成功嗡综,要么全部失敗,不存在部分成功的狀態(tài)杜漠。而一致性關(guān)注數(shù)據(jù)的可見(jiàn)性极景,中間狀態(tài)的數(shù)據(jù)對(duì)外部不可見(jiàn),只有最初狀態(tài)和最終狀態(tài)的數(shù)據(jù)對(duì)外可見(jiàn)驾茴。
2.在未提交讀的隔離級(jí)別下盼樟,會(huì)造成臟讀,這就是因?yàn)橐粋€(gè)事務(wù)讀到了另一個(gè)事務(wù)操作內(nèi)部的數(shù)據(jù)锈至。ACID中是的一致性描述的是一個(gè)最理想的事務(wù)應(yīng)該怎樣的晨缴,是一個(gè)強(qiáng)一致性狀態(tài),如果要做到這點(diǎn)峡捡,需要使用排它鎖把事務(wù)排成一隊(duì)击碗,即Serializable的隔離級(jí)別筑悴,這樣性能就大大降低了。現(xiàn)實(shí)是骨感的稍途,所以使用隔離性的不同隔離級(jí)別來(lái)破壞一致性阁吝,來(lái)獲取更好的性能。
2. 自動(dòng)提交 | autocommit
參考2:https://www.bilibili.com/video/BV1Vt411z7wy?p=58
#MySQL默認(rèn)開(kāi)啟“自動(dòng)提交”功能械拍,
#即每條SQL語(yǔ)句執(zhí)行完畢之后都會(huì)自動(dòng)commit突勇,因此接著使用rollback相當(dāng)于沒(méi)有效果
#查看autocommit功能的狀態(tài)(1為開(kāi)啟,0為關(guān)閉)
mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
| 1 |
+--------------+
1 row in set (0.00 sec)
#手動(dòng)關(guān)閉autocommit功能坷虑,就可以隨時(shí)隨地使用rollback甲馋。不過(guò)這樣太隨意了,不推薦
mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)
mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
| 0 |
+--------------+
1 row in set (0.00 sec)
#
3. 手動(dòng)開(kāi)啟事務(wù)transaction
#寫(xiě)法1
mysql> begin;
Query OK, 0 rows affected (0.28 sec)
#寫(xiě)法2
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
4. 事務(wù)的隔離級(jí)別
- 查看隔離級(jí)別(MySQL默認(rèn)隔離級(jí)別——可重復(fù)讀)
#會(huì)話范圍的迄损,每一次數(shù)據(jù)庫(kù)連接都是一次會(huì)話摔刁,如一次jdbc連接
mysql> select @@session.transaction_isolation;
+---------------------------------+
| @@session.transaction_isolation |
+---------------------------------+
| REPEATABLE-READ |
+---------------------------------+
1 row in set (0.23 sec)
#全局、系統(tǒng)范圍的
mysql> select @@global.transaction_isolation;
+--------------------------------+
| @@global.transaction_isolation |
+--------------------------------+
| REPEATABLE-READ |
+--------------------------------+
1 row in set (0.28 sec)
- 修改隔離級(jí)別
#會(huì)話范圍的
mysql> set session transaction isolation level read committed;
Query OK, 0 rows affected (0.21 sec)
#全局海蔽、系統(tǒng)范圍的
mysql> set global transaction isolation level read uncommitted;
Query OK, 0 rows affected (0.28 sec)
#注意:在修改隔離級(jí)別時(shí)若不指定 GLOBAL/SESSION 關(guān)鍵字,
#則只會(huì)針對(duì)當(dāng)前會(huì)話中的下一個(gè)事務(wù)生效绑谣,
#當(dāng)下一個(gè)事務(wù)結(jié)束后党窜,又會(huì)恢復(fù)到當(dāng)前會(huì)話session設(shè)定的隔離級(jí)別。
- 4種隔離級(jí)別及相應(yīng)的并發(fā)操作問(wèn)題
參考4:https://www.cnblogs.com/myseries/p/10748912.html
注:上述內(nèi)容借宵,部分來(lái)自于網(wǎng)絡(luò)或書(shū)籍幌衣,僅作為學(xué)習(xí)記錄使用。由于參考來(lái)源眾多壤玫,未依次標(biāo)明出處豁护。若有原作者看到此文,麻煩聯(lián)系本人欲间,我會(huì)第一時(shí)間處理楚里。我對(duì)由此給您帶來(lái)的不便,深感抱歉猎贴!望見(jiàn)諒班缎,謝謝!