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