做網(wǎng)站月收入多少/百度網(wǎng)站推廣
事務(wù)是一組操作的集合,我們將一組操作視為一個(gè)整體,所以事務(wù)里面的操作的時(shí)候要么同時(shí)成功,要么同時(shí)失敗,之所以會(huì)有事務(wù)也是因?yàn)槲覀冊(cè)趯?shí)際生活中會(huì)用到
最典型的例子就是轉(zhuǎn)賬操作:A向B進(jìn)行轉(zhuǎn)賬,A這邊扣款成功的同時(shí)B那邊一定是收款成功的,如果沒(méi)有事務(wù)的話就會(huì)出現(xiàn)A扣款成功但B沒(méi)有收到款的情況
文章目錄
- 1.事務(wù)的操作
- 2.事務(wù)的特性
- 3.并發(fā)事務(wù)的問(wèn)題
- 4.事務(wù)隔離級(jí)別
1.事務(wù)的操作
正常提交事務(wù)的流程為: 開(kāi)始事務(wù)->執(zhí)行操作->提交事務(wù)
如果出現(xiàn)異常的話則需要回滾事務(wù)
開(kāi)啟事務(wù):begin;
提交事務(wù):commit;
回滾事務(wù):rollback;
begin之后加上要執(zhí)行的SQL語(yǔ)句即可,然后是commit,提交失敗則執(zhí)行rollback
MySQL的事務(wù)默認(rèn)是自動(dòng)提交的,當(dāng)執(zhí)行一條DML語(yǔ)句時(shí)MySQL會(huì)自動(dòng)提交事務(wù),如果你想要修改MySQL提交事務(wù)的方式
select @@autocommit; 查看事務(wù)提交方式(為啥這兩個(gè)@顏色還不一樣呢(⊙_⊙)?)
set @@autocommit=0; 0為手動(dòng)提交,1為自動(dòng)提交
2.事務(wù)的特性
-
原子性 : 事務(wù)是不可分割的最小的操作單元,里面的操作要么全部成功,要么全部失敗
-
一致性 : 事務(wù)完成的時(shí)候必須使所有的數(shù)據(jù)保持一致?tīng)顟B(tài)
-
隔離性 : 數(shù)據(jù)庫(kù)系統(tǒng)提供的隔離機(jī)制,目的是保證事務(wù)在不受外部并發(fā)操作影響的環(huán)境下運(yùn)行
-
持久性 : 一個(gè)事務(wù)一旦被提交,它對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)所做的改變是永久的
針對(duì)隔離性,我們來(lái)講下如果沒(méi)有隔離性并發(fā)事務(wù)會(huì)造成的問(wèn)題
3.并發(fā)事務(wù)的問(wèn)題
最常見(jiàn)的問(wèn)題有臟讀,不可重復(fù)讀和幻讀
-
臟讀:指一個(gè)事務(wù)讀取到另一個(gè)事務(wù)還未提交的數(shù)據(jù),如下圖
事務(wù)1修改了數(shù)據(jù),但是還沒(méi)有提交,此時(shí)事務(wù)2對(duì)數(shù)據(jù)進(jìn)行查詢(xún),那么事務(wù)2就會(huì)查詢(xún)到已經(jīng)被修改但是還未提交的數(shù)據(jù) -
不可重復(fù)讀:一個(gè)事務(wù)先后讀取同一條記錄,但兩次讀取出來(lái)的結(jié)果是不同的,如圖
事務(wù)1在兩次查詢(xún)期間,事務(wù)2對(duì)數(shù)據(jù)進(jìn)行了修改并提交事務(wù),導(dǎo)致事務(wù)1兩次查詢(xún)的數(shù)據(jù)結(jié)果不一致 -
幻讀:幻讀是在解決不可重復(fù)讀的基礎(chǔ)上出現(xiàn)的新問(wèn)題,事務(wù)在查詢(xún)某個(gè)數(shù)據(jù)的時(shí)候發(fā)現(xiàn)數(shù)據(jù)不存在,于是進(jìn)行插入數(shù)據(jù),但是在插入數(shù)據(jù)的時(shí)候發(fā)現(xiàn)數(shù)據(jù)又存在,就像出現(xiàn)了幻覺(jué)一樣,如圖
由于解決了不可重復(fù)度,所以事務(wù)1兩次select結(jié)果均為未找到,但是卻無(wú)法插入數(shù)據(jù)
4.事務(wù)隔離級(jí)別
隔離級(jí)別 | 臟讀 | 不可重復(fù)讀 | 幻讀 |
---|---|---|---|
讀未提交(read uncommited) | × | × | × |
讀已提交(read commited) | √ | × | × |
可重復(fù)讀(repeatable read) | √ | √ | × |
串行化(serializable) | √ | √ | √ |
上述4個(gè)級(jí)別,串行化隔離級(jí)別最高,可以解決所有的并發(fā)事務(wù)問(wèn)題,但同時(shí)性能也是最差的,這就需要根據(jù)實(shí)際情況來(lái)選擇事務(wù)的隔離級(jí)別了
在MySQL中默認(rèn)的隔離級(jí)別是可重復(fù)讀
設(shè)置事務(wù)的SQL語(yǔ)句如下:
select @@tx_isolation; 查看事務(wù)隔離級(jí)別(個(gè)人使用的5.6版本的SQL語(yǔ)句,下面的是高版本的SQL語(yǔ)句)
select @@transaction_isolation; set [session/global] transaction isolation level 隔離級(jí)別; 設(shè)置事務(wù)隔離級(jí)別,set session是僅當(dāng)前客戶(hù)端窗口有效,set global則是所有客戶(hù)端的窗口都有效
MySQL的基礎(chǔ)部分到這基本結(jié)束了,主要包括基礎(chǔ)的SQL語(yǔ)句,MySQL的函數(shù),數(shù)據(jù)約束,多表查詢(xún)和這篇的事務(wù),下一篇開(kāi)始就開(kāi)始進(jìn)階的內(nèi)容了,完