數據庫事務詳解(面試常考點)

(一)事務

事務就是就是一個操作可以分爲多個單元,這些單元要麼全部成功,要麼全部失敗。

(二)事務的特性

原子性:事務是一個不可分割的單位,在一組事務操作中,可以分爲多個步驟,這些步驟要麼全部成功,要麼全部失敗。

一致性:數據庫事務執行前後,數據在完整性上是前後一致的。

隔離性:事務存在線程安全問題。隔離性是爲了解決事務的線程安全問題而存在的一個特性。兩個事務同時訪問一條數據,一個事務可能會受到另外一個事務的影響,導致數據前後讀取操作不一致。這種情況可以通過隔離性來避免。

持久性:如果數據庫中的事務被提交,則數據庫中的數據將會發生真實的修改,這個過程不可逆,任何操作都無法撤銷已經被提交的事務。

(三)隔離性概述

在數據庫中可能會出現線程安全問題,問題包含虛讀/幻讀、不可重複讀,髒讀。這些問題可以通過修改數據庫的隔離級別來避免。數據庫的管理員可以根據自己的業務需求對隔離級別進行修改,如果希望避免的問題較多,則可以提升隔離級別,如果要求效率大於數據的安全性,則可以降低數據庫的隔離級別。

線程安全問題概述:

  1. 髒讀:在一次事務提交前後,另一個事務讀取到了不同數據,這種情況稱之爲髒讀。
  2. 不可重複讀:一個事務讀取到另外一個已經提交事務的結果,導致事務提交前後數據讀取不一致,這種現象稱之爲不可重複讀。
  3. 虛讀/幻讀:在整表操作的情況下,一個事務讀取到另一個事務已經提交的數據,造成數據前後不一致,這種情況稱之爲虛讀/幻讀

(四)數據庫的隔離級別 

read uncommitted

最低的隔離級別,在這種隔離級別之下安全性最低,所有事務都會出現線程安全問題。

問題包含髒讀、不可重複讀、虛讀/幻讀。

read committed

較低的隔離級別,在這種隔離級別之下,安全性較低,事務可能會發生線程安全問題。

問題包含不可重複度、虛讀/幻讀。可以避免髒讀。

repeatable read

mysql數據庫默認的事務隔離級別。

較高的隔離級別,在這種隔離級別之下,安全性較高,不容易出現線程安全問題。

問題包含虛讀/幻讀。可以避免髒讀/不可重複讀。

serializable

最高的隔離級別。在這種隔離級別之下,安全性最高,效率最低

所有的事務均不會出現線程安全問題,整個數據庫的運行就變成另一個串行化的運行模式。

這種隔離級別下任何線程問題都不會出現。

 

提升數據的隔離級別可以提升數據庫的數據安全性,保證數據正確,但是由於數據庫提升隔離性,是通過添加鎖來實現,所以隨之帶來的是效率的降低,如果安全性很高,執行效率將會很低。數據庫的執行效率和安全性都應該保證,所以應該在保證數據安全的情況下,盡
可能的提升數據庫的執行效率。

安全性:
Serializable > repeatable read > read committed > read uncommitted
效率:
read uncommitted > read committed > repeatable read > serializable

補充:

設置數據庫的隔離級別:set global/session transaction isolation level 隔離級別;

global表示在全局範圍內設置隔離級別,重啓mysql服務端之後,mysql的隔離級別便是global。

session 表示在當前窗口設置全局隔離級別,設置的隔離級別只對當前窗口的mysql的隔離級別有用。

查詢數據庫隔離級別: select @@tx_isolation;/ select @@transaction_isolation;

(五)鎖問題

數據庫隔離性的實現,其實就是在數據庫服務器中添加各種各樣的鎖。

【共享鎖和排他鎖】

共享鎖(S鎖),又稱爲讀鎖
排他鎖(X鎖),又稱爲寫鎖

共享鎖:

select * from ad_plan lock in share mode;

排他鎖:

select * from ad_plan for update

在非Serializable級別之下,查詢不添加鎖。

在Serializable級別之下,查詢添加共享鎖

在任意隔離級別之下,更新添加排它鎖

共享鎖和共享鎖可以共存。

共享鎖和排他鎖不可以共存。

排它鎖和排它鎖不可以共存。

共享鎖適用於兩張表存在業務關係時的一致性要求,排他鎖適用於操作同一張表時的一致性要求。

關於共享鎖與排他鎖,大家可以參考https://www.cnblogs.com/liaoweipeng/p/7615959.html

表級鎖和行級鎖

表級鎖是指可以鎖住整張表的鎖,行級鎖是指鎖住一行數據的鎖。被鎖住的表或者數據只能被一個事務操作。表級鎖和行級鎖已經在數據庫實現的時候有數據庫者數據只能被一個事務操作。表級鎖和行級鎖已經在數據庫實現的時候有數據庫服務器指定完成,所以不需要數據管理員手動指定。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章