當前位置:
首頁 > 最新 > 什麼轉賬失敗了?那可能是「資料庫事務」沒有處理好

什麼轉賬失敗了?那可能是「資料庫事務」沒有處理好

閱讀文本大概需要 6 分鐘。

中午和同事一起吃飯,飯後AA,可一直沒收到同事轉賬,下班前提醒了她。同事說:早就給你轉過去了啊,我的錢都扣了的。可是,你的賬戶上確實沒有收到...

這事可能真不是你的同事想懶你這十幾塊錢,有可能是遇到資料庫事務出了問題...

資料庫事務

一個資料庫事務通常包含了一個序列的對資料庫的讀/寫操作。它的存在包含有以下兩個目的:

為資料庫操作序列,提供了一個從失敗中恢復到正常狀態的方法,同時提供了資料庫即使在異常狀態下仍能保持一致性的方法。

當多個應用程序在並發訪問資料庫時,可以在這些應用程序之間提供一個隔離方法,以防止彼此的操作互相干擾。

當事務被提交給了DBMS(資料庫管理系統),則DBMS(資料庫管理系統)需要確保該事務中的所有操作都成功完成且其結果被永久保存在資料庫中,如果事務中有的操作沒有成功完成,則事務中的所有操作都需要被回滾,回到事務執行前的狀態;同時,該事務對資料庫或者其他事務的執行無影響,所有的事務都好像在獨立的運行

案例說明

老馬給老王轉1000塊錢,這個過程涉及到兩個資料庫的操作:

1、先是從老馬的賬上扣除1000;

2、再在老王的賬上加上1000。

如果這兩次操作是獨立的,那麼有可能老馬扣掉1000塊錢之後,伺服器異常,老王的帳上沒有加上1000。

我們就希望這兩次資料庫的操作不是相互獨立的,即處於同一事務。

資料庫中的事務 是指邏輯上的一組操作,這組操作要麼都執行成功,要麼都不執行成功。

技術分析

2.1 事務的四大特性(ACID)

事務的四大特性分別是:

l原子性(Atomicity):事務中所有操作是不可再分割的原子單位。事務中的所有操作要麼全部執行成功,要麼全部執行失敗。

l一致性(Consistency):事務執行後,資料庫狀態與其他業務規則保持一致。如轉賬業務,無論事務是否執行成功,參與轉賬的兩個賬號的餘額之和應該保持不變。

l隔離性(Isolation):在並發操作中,不同事務之間應該隔開,使每個並發中的事務不會相互干擾。

l持久性(Durability):一旦事務提交成功,事務中所有的數據操作都必須持久化到資料庫。即使提交事務後,資料庫馬上崩潰,在資料庫重啟的時候,也必須能保證通過某種機制恢複數據。

2.2 Mysql中開啟和關閉事務

默認情況下,mysql每執行一條sql語句,都是一個單獨的事務,如果需要在一個事務中包含多條sql語句,那麼需要在執行sql之前開啟事務.

l 開啟事務:start transaction

l 出現異常:rollback( 回滾 )

l 關閉事務:commit( 提交 )

在執行sql之前,先執行start transaction,這就開啟了一個事務,然後可以去執行多條sql語句,最後要結束事務 commit 表示提交,即事務中的多條 sql語句所做出的影響會持久化到資料庫。或者通過 rollback 回滾,即回到事務起點,之前做的所有操作都將被取消。

以tom給jim轉賬為例進行演示:

查詢所有人的餘額

開啟事務

tom減去100塊錢

查詢餘額

給jim加上100塊錢

再次查詢餘額

回滾事務

再次查詢餘額

之前的操作全部取消了...

事務的隔離級別

如果我們不考慮事務的隔離性,當有多個線程在進行資料庫操作的時候,會出現一些嚴重的問題.

3.1 事務的並發讀問題

l臟讀:讀取到另一個事務未提交的數據

l不可重複讀:對同一欄位的兩次讀取 數據不一致。因為另一事務對該數據進行了修改(update)

l幻讀(虛讀):對同一張表的兩次查詢 記錄不一致。因為另一個事務插入( insert )了一條數據

3.2 事務的四大隔離級別

為了防止並發讀問題,mysql 有四種隔離級別。在相同的數據環境下,使用相同的輸入,執行相同的工作,但隔離級別不同,可以導致不同的結果。

Serializable:串列化

不會出現任何並發問題,因為它對同一數據的訪問是串列的,而不是並發訪問的.但是這種級別性能最差

Repeatable Read:可重複讀(Mysql 默認隔離基本)

防止臟讀和不可重複讀,會出現虛讀。性能比Serializable好。

Read Committed:讀已提交數據(Oracle 默認隔離級別)

防止臟讀,性能比Repeatable Read好.

Read Uncommitted:提交未讀數據

性能最好,但是所有並發讀問題都可能出現。

後期更多優選推文,各種資料、分享猛料放出,關注「阿凱不錯」公眾號,獲取實時動態:

大家還有什麼需求,也可以後台留言給我,公眾號上還有其他學習資源哦....

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員阿凱 的精彩文章:

TAG:程序員阿凱 |