??引言
???♂?作者簡介:生魚同學,大數(shù)據(jù)科學與技術(shù)專業(yè)碩士在讀?????,曾獲得華為杯數(shù)學建模國家二等獎??,MathorCup 數(shù)學建模競賽國家二等獎??,亞太數(shù)學建模國家二等獎??。
??研究方向:復雜網(wǎng)絡科學
??興趣方向:利用python進行數(shù)據(jù)分析與機器學習,數(shù)學建模競賽經(jīng)驗交流,網(wǎng)絡爬蟲等。
事務是一組操作的集合,其會把所有的操作作為一個整體提交或者撤銷。
在本文中,我們將會對SQL中的事務進行介紹與演示,話不多說,我們開始吧。
??事務
??事務的概念
為了更好的了解事務的概念,我們看下面這個例子。
假設A要給B轉(zhuǎn)賬100元,此時我們需要進行如下三個操作:
- 查詢A的賬戶余額
- A賬戶余額-100
- B賬戶余額+100
而這種操作必須一次性完成,如果整個操作中途出現(xiàn)了問題那么就應該立即回滾,停止所有的賬戶操作。
如果上述操作沒有停止,那么將會導致有不可與預知的錯誤。
SQL中也支持這種將很多操作集中在一起的方式就是事務,接下來我們看事務的操作。
??事務操作
??查看與設置事務提交方式
在SQL中默認事務時自動提交的,所以當我們編寫SQL的語句時,默認其就是一個事務。我們可以通過語句來查詢事務的提交方式并修改它,代碼如下:
SELECT @@AUTOCOMMIT;
可以看到,默認的提交方式為1,也就是自動提交。
特別的,我們可以對其進行修改為手動提交,代碼如下:
SET @@AUTOCOMMIT = 0;
??提交事務與回滾事務
在更改為手動提交事務后,我們就需要手動的通過命令來進行事務的提交與回滾,代碼如下:
# 提交事務
COMMIT;
# 回滾事務
ROLLBACK;
接下來,我們就進行事務提交與回滾的演示。首先我們建立一個賬戶余額表并為其添加兩條數(shù)據(jù),代碼如下:
CREATE TABLE MONEY(
NAME VARCHAR(10) NOT NULL,
MONEY INT DEFAULT 0
);
INSERT INTO MONEY (NAME,MONEY) VALUES('TOM',1000),('JANE',1000);
結(jié)果如下:
假設我們需要把TOM的余額修改為2000,此時我們在控制臺1進行下面的操作:
update money set money = 2000 where name = 'TOM';
在我們查詢表中的值的時候出現(xiàn)了下面的結(jié)果,可是我們真的修改成功了嗎?
這時我們打開控制臺2,繼續(xù)查詢上述相同的內(nèi)容結(jié)果如下:
顯然,我們剛才修改的結(jié)果還沒有真正上傳到數(shù)據(jù)庫,而是在控制臺1中執(zhí)行了。此時我們就需要COMMIT;
來完成控制臺1的事務。
此時我們在控制臺1中COMMIT提交我們的事務,這就能夠在控制臺2查詢到我們的修改了。
另外,我們也可以不使用SET @@AUTOCOMMIT
設定事務狀態(tài),可以使用下面的開啟事務代碼代替:
# 開啟事務
START TRANSACTION;
# 提交事務
COMMIT;
# 回滾事務
ROLLBACK;
下面我們就利用上述的代碼來示范一下事務回滾,假設還是上述相同的情況,這次我們希望需要把JANE的余額修改為2000。為了演示方便,我們將在兩個控制臺中演示上述操作:
可以看到,我們在左邊的控制臺1進行了更新操作,而控制臺2還沒有收到更新操作,這是因為我們在控制臺1中開啟了事務。與此同時,雞舍我們想要放棄上述的操作而取消事務的進行,可以使用ROLLBACK
進行回滾,這樣不會對數(shù)據(jù)庫中的數(shù)據(jù)有任何影響。
??事務的特性
- 原子性:事務是不可分割的最小操作單元,要么全部成功,要么全部失敗
- 一致性:事務完成時,必須使所有的數(shù)據(jù)都保持一致狀態(tài)。
- 隔離性:數(shù)據(jù)庫系統(tǒng)提供的隔離機制,保證事務在不受外部并發(fā)操作影響的獨立環(huán)境下運行
- 持久性:事務一旦提交或回滾,它對數(shù)據(jù)庫中的數(shù)據(jù)的改變就是永久的。
??并發(fā)事務問題
- 臟讀:個事務讀到另外一個事務還沒有提交的數(shù)據(jù) 。
- 不可重復讀:一個事務先后讀取同一條記錄,但兩次讀取的數(shù)據(jù)不同,稱之為不可重復讀。
- 幻讀:一個事務按照條件查詢數(shù)據(jù)時,沒有對應的數(shù)據(jù)行,但是在插入數(shù)據(jù)時,又發(fā)現(xiàn)這行數(shù)據(jù)已經(jīng)存在。
??事務隔離級別
為了處理上述的并發(fā)事務級別,我們可以對事務進行事務級別的更改,SQL中的事務隔離級別種類如下所示:
隔離級別 | 臟讀 | 不可重復讀 | 幻讀 |
---|---|---|---|
Read uncommitted | —— | —— | —— |
Read committed | —— | —— | 解決 |
Repeatable Read(默認) | —— | 解決 | 解決 |
Serializable | 解決 | 解決 | 解決 |
我們可以下面的代碼查看事務隔離級別或者設置事務隔離級別:
# 查看事務隔離級別
SELECT @@TRANSACTION ISOLATION
# 設置事務隔離級別
SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE}
??總結(jié)
本次列舉了SQL中常用事務相關(guān)語句,在實際學習的過程中還需要多學習以及使用才能熟練掌握。文章來源:http://www.zghlxwxcb.cn/news/detail-422569.html
余下的SQL內(nèi)容我也將持續(xù)更新,如果感興趣的話不妨訂閱本專欄或者點個關(guān)注,我們下次再見。文章來源地址http://www.zghlxwxcb.cn/news/detail-422569.html
到了這里,關(guān)于【建議收藏】數(shù)據(jù)庫 SQL 入門——事務(內(nèi)附演示)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!