事務的介紹以及事務隔離級別

2021-07-28 08:33:08 字數 1405 閱讀 7799

在資料庫操作中,一項事務(transaction) 是由一條或多條運算元據庫的sql語句組成的乙個不可分割的工作單元。當事務中的所有操作都正常完成時,整個事務才能被提交到資料庫中,如果有一項操作沒有完成,則整個事務會被回滾。

其實事務總結起來理解為:邏輯上的一組操作,組成這組操作的各個單元,要麼一起成功,要麼一起失敗。

事務有很嚴格的定義,需要同時滿足四個特性,即原子性、一致性、隔離性、永續性。這四個特性通常稱之為acid特性,具體如下:

相對於序列處理來說,併發處理能力大大增加資料庫資源的利用率,提高資料庫系統的事務吞吐量,從而可以支援更多的使用者。但併發事務處理也會帶來一些問題,主要包括以下幾種情況。

如果看上邊不能夠看懂,可以看這篇部落格 髒讀,幻讀,不可重複讀詳細介紹

在上面講到的併發事務處理帶來的問題中,「更新丟失」通常是應該·完全避免的。但防止更新丟失,並不能單靠資料庫事務控制器來解決,需要應用程式對要更新的資料加必要的鎖來解決,因此,防止更新丟失應該是應用的責任。

為了避免事務併發問題的發生,在標準sql規範中,定義了4個事務隔離級別,不同的隔離級別對事務的處理不同。

隔離級別——————–含義

read_uncommitted——————–允許你讀取還未提交的改變了的資料。可能導致髒、幻、不可重複讀

read_committed——————–允許在併發事務已經提交後讀取。可防止髒讀,但幻讀和不可重複讀仍可發生

repeatable_read——————–對相同欄位的多次讀取是一致的,除非資料被事務本身改變。可防止髒、不可重複讀,但幻讀仍可能發生

serializable——————–完全服從acid的隔離級別,確保不發生髒、幻、不可重複讀。這在所有的隔離級別中是最慢的,它是典型的通過完全鎖定在事務中涉及的資料表來完成的。

事務的隔離級別,是由資料庫提供的,並不是所有資料庫都支援四種隔離級別

mysql:read_uncommitted、read_committed、repeatable_read、serializable,(預設為repeatable_read)

oracle

:read_uncommitted、read_commiteed、serializable,(預設為read_commiteed)

在使用資料庫時候,隔離級別越高,安全性越高,效能越低。

實際開發中,不會選擇最高或者最低隔離級別,選擇read_committed(oracle預設)、repeatable_read(mysql預設)
《深入淺出mysql》

事務的隔離級別舉例 事務的隔離級別

乙個事務是乙個完整的業務邏輯單元,不能再分,要麼全部執行成功,要麼全部失敗。比如 a給b轉賬100元,a的銀行卡就會少100元,b的銀行卡就會多100元,整個過程要麼全部執行成功,要麼全部失敗。a 原子性。事務是最小的業務邏輯單元。b 一致性。乙個事務必須保證多條dml語句同時成功或失敗。c 隔離性...

事務的特性以及隔離級別

1 什麼是事務 事務是併發控制的單位,一系列操作組成的工作單元,該工作單元內的操作是不可分割的,也就是事務具有原子性,乙個事務中的一系列的操作要麼全部成功,要麼乙個都不做,所有操作必須成功完成,否則在每個操作中所作的所有更改都會被撤消。事務的結束有兩種,當事務中的所以步驟全部成功執行時,事務提交。如...

mysql的事務以及隔離級別

實際專案中的事務 題外話事務是最小的不可分割的工作單元,事務能保證乙個業務的完整性 執行乙個事務時,事務中只要有乙個操作失敗,整個事務就會失敗 銀行轉賬系統,先扣費再轉賬,如果扣費成功了,但是轉賬失敗了,假如扣費是乙個事務,轉賬為乙個事務,就會導致程式扣費成功了,但是沒有轉賬成功,這樣會造成要取錢的...