雜項
InnoDB
最大特點:支持事務(wù)和行鎖;
MyISAM
不支持事務(wù)
介紹
一個事務(wù)是由一條或者多條對數(shù)據(jù)庫操作的SQL語句所組成的一個不可分割的單元,只有當(dāng)事務(wù)中的所有操作都正常執(zhí)行完了,整個事務(wù)才會被提交給數(shù)據(jù)庫。事務(wù)有如下特性:
1.事務(wù)的所有SQL語句全部執(zhí)行成功,才能提交(commit)事務(wù),把結(jié)果寫回磁盤上。
2.事務(wù)執(zhí)行過程中,有的SQL出現(xiàn)錯誤,那么事務(wù)必須要回滾(rollback)到最初的狀態(tài)。
ACID特性
- 事務(wù)的原子性(Atomic)
- 事務(wù)的一致性(Consistency)
- 事務(wù)的隔離性(Isolation)
當(dāng)兩個或者多個事務(wù)并發(fā)執(zhí)行時,為了保證數(shù)據(jù)的安全性,將一個事物內(nèi)部的操作與其它事務(wù)的操作隔離起來,不被其它正在執(zhí)行的事務(wù)所看到,使得并發(fā)執(zhí)行的各個事務(wù)之間不能互相影響。
- 事務(wù)的持久性(Durability)
事務(wù)完成(commit)以后,DBMS保證它對數(shù)據(jù)庫中的數(shù)據(jù)的修改是永久性的,即使數(shù)據(jù)庫因為故障出錯,也應(yīng)該能夠恢復(fù)數(shù)據(jù)!
ACD特性是由mysql的undo log和 redo log 保證;
I特性是由mysql事務(wù) 鎖機制保證;
mysql中最重要的是日志而不是數(shù)據(jù)。
事務(wù)相關(guān)指令
BEGIN;
開啟一個事務(wù)
COMMIT;
提交一個事務(wù)
ROLLBACK;
回滾一個事務(wù)到初始的位置
SAVEPOINT point1;
設(shè)置一個名字為point1的保存點
ROLLBACK TO point1;
事務(wù)回滾到保存點point1,而不是回滾到初始狀態(tài)
SET TX_ISOLATION='REPEATABLE-READ';
設(shè)置事務(wù)的隔離級別
SELECT @@ TX_ISOLATION;
查詢事務(wù)的隔離級別
實踐例子
查看是否設(shè)置了自動提交:
事務(wù)并發(fā)存在的問題
- 臟讀(Dirty Read):一個事務(wù)讀取了另一個事務(wù)未提交的數(shù)據(jù)。例如當(dāng)事務(wù)A和事務(wù)B并發(fā)執(zhí)行時,當(dāng)事務(wù)A更新后,事務(wù)B查詢讀取到A尚未提交的數(shù)據(jù),此時事務(wù)A回滾,則事務(wù)B讀到的數(shù)據(jù)就是無效的臟數(shù)據(jù)。(事務(wù)B讀取了事務(wù)A尚未提交的數(shù)據(jù))
- 不可重復(fù)讀(NonRepeatable Read):一個事務(wù)的操作導(dǎo)致另一個事務(wù)前后兩次讀取到不同的數(shù)據(jù)。例如當(dāng)事務(wù)A和事務(wù)B并發(fā)執(zhí)行時,當(dāng)事務(wù)B查詢讀取數(shù)據(jù)后,事務(wù)A更新操作更改事務(wù)B查詢到的數(shù)據(jù),此時事務(wù)B再次去讀該數(shù)據(jù),發(fā)現(xiàn)前后兩次讀的數(shù)據(jù)不一樣。(事務(wù)B讀取了事務(wù)A已提交的數(shù)據(jù))
- 虛讀(Phantom Read)幻讀:一個事務(wù)的操作導(dǎo)致另一個事務(wù)前后兩次查詢的結(jié)果數(shù)據(jù)量不同。(事務(wù)B讀取了事務(wù)A新增加的數(shù)據(jù)或者讀不到事務(wù)A刪除的數(shù)據(jù))
事務(wù)的隔離級別
MySQL支持的四種隔離級別是:
1、READ-UNCOMMITTED
。未提交讀。說明在提交前一個事務(wù)可以看到另一個事務(wù)的變化。這樣讀臟數(shù)據(jù),不可重復(fù)讀和虛讀都是被允許的。
2、READ-COMMITTED
。已提交讀。說明讀取未提交的數(shù)據(jù)是不允許的。這個級別仍然允許不可重復(fù)讀和虛讀產(chǎn)生。
3、REPEATABLE-READ
。可重復(fù)讀。說明事務(wù)保證能夠再次讀取相同的數(shù)據(jù)而不會失敗,但虛讀仍然會出現(xiàn)。
4、SERIALIZABLE
。串行化。是最高的事務(wù)級別,它防止讀臟數(shù)據(jù),不可重復(fù)讀和虛讀。(它相當(dāng)于加了讀寫鎖,某個會話讀時,其他線程不能寫)
注解
事務(wù)隔離級別越高,為避免沖突所花費的性能也就越多,降低并發(fā)度。文章來源:http://www.zghlxwxcb.cn/news/detail-487338.html
在“可重復(fù)讀”級別,實際上可以解決部分的虛讀問題,但是不能防止 update
更新產(chǎn)生的虛讀問題,要禁止幻讀產(chǎn)生,還是需要設(shè)置串行化隔離級別。文章來源地址http://www.zghlxwxcb.cn/news/detail-487338.html
到了這里,關(guān)于MySQL事務(wù)相關(guān)筆記的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!