什麼是事務
保證業務操作完整性的一種資料庫機制
事務(acid)# 事務四大特性(acid)
## 原子性(atomicity)
原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾。
因此事務的操作如果成功就必須要完全應用到資料庫,如果操作失敗則不能對資料庫有任何影響。
## 一致性(consistency)
事務開始前和結束後,資料庫的完整性約束沒有被破壞。比如a向b轉賬,不可能a扣了錢,b卻沒收到
## 隔離性(lsolation)
隔離性是當多個使用者併發訪問資料庫時,比如操作同一張表時,資料庫為每乙個使用者開啟的事務,不能被其他事務的操作所干擾,多個併發事務之間要相互隔離。
同一時間,只允許乙個事務請求同一資料,不同的事務之間彼此沒有任何干擾。比如a正在從一張銀行卡中取錢,在a取錢的過程結束前,b不能向這張卡轉賬。
## 永續性
永續性是指乙個事務一旦被提交了,那麼對資料庫中的資料的改變就是永久性的,即便是在資料庫系統遇到故障的情況下也不會丟失提交事務的操作。
如何控制事務jdbc:
connection.setautocommit(false); //開啟
connection.commit(); //提交
connection.rollback(); //回滾
mybatis: (sqlseesion在底層封裝了connection)
mybatis自動開啟事務 //開啟
sqlsession.commit(); //提交
sqlsession.rollback(); //回滾
# 小結
對於事務,有三個操作,開啟、提交、回滾
控制事務的底層 都是connection物件完成的
事務的屬性事務屬性:描述事務特徵的一系列值
1. 隔離屬性
2. 傳播屬性
3. 唯讀屬性
4. 超時屬性
5. 異常屬性
如何新增事務的屬性@target()
@retention
(retentionpolicy.runtime)
@inherited
@documented
public @inte***ce
transactional
;//事務回滾規則
string[
]rollbackforclassname()
default
;//事務回滾規則
class<
?extends
throwable
>
norollbackfor()
default
;//事務回滾規則
string[
]norollbackforclassname()
default
;//事務回滾規則
}
public
inte***ce
transactiondefinition
隔離屬性# 隔離屬性
他描述了事務解決併發問題的特徵
# 什麼是併發
多個事務(使用者)在同一時間,訪問操作了相同的資料
# 如何解決併發
通過隔離屬性解決,隔離屬性中設定不同的值,解決併發處理過程中的問題
併發產生的問題# 髒讀
事務a讀取了事務b更新的資料,然後b回滾操作,那麼a讀取到資料時髒資料
解決方案 @transational(isolation=isolation.read_commited)
# 不可重複讀
事務a多次讀取同一資料,事務b在事務a多次讀取的過程中,對資料作了更新並提交,導致事務a多次讀取同一資料時,結果因此本事務先後讀到的資料結果會不一致。
解決方案 @transational(isolation=isolation.repeatable_read)
本質:一把行鎖
# 幻讀
乙個事務中,多次對整張表進行查詢統計,但是結果不一樣,會在本事務中產生資料不一致的問題
例如:事務 t1 對乙個表中所有的行的某個資料項做了從「1」修改為「2」的操作 這 時事務 t2 又對這個表中插入了一行資料項,而這個資料項的數值還是為「1」並且 提交給資料庫。 而操作事務 t1 的使用者如果再檢視剛剛修改的資料,會發現還 有跟沒有修改一樣,其實這行是從事務 t2 中新增的,就好像產生幻覺一樣,這 就是發生了幻讀。
解決方案 @transational(isolation=isolation.serializable)
本質:一把表鎖
# 小結
不可重複讀的和幻讀很容易混淆,不可重複讀側重於修改,幻讀側重於新增或刪除。解決不可重複讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表。
事務的隔離級別
事務隔離級別
髒讀不可重複讀
幻讀讀未提交 read - uncommitted是是
是不可重複讀 read - committed否是
是可重複讀 repeatable - read否否
是序列化 serializable否否
否
# 讀未提交
另乙個事務修改了資料,但尚未提交,而本事務中的select會讀到這些未被提交的資料髒讀
# 不可重複讀
事務a多次讀取同一資料,事務b在事務a多次讀取的過程中。對資料作了更新並提交,導致事務a多次讀取同一資料時,結果因此本事務先後兩次讀到的資料結果會不一致。
# 可重複讀
在同一事務裡,select的結果是事務開始時時間點的狀態,因此,同樣的select操作讀到的結果會是一致的,但是會有幻讀的現象
# 序列化
最高的隔離級別,在這個隔離級別下,不會產生任何異常。併發的事務,就像事務是在乙個個按照順序執行一樣。
mysql預設的事務隔離級別mysql預設的事務隔離級別 -- 可重複讀 (repeatable - read)
傳播屬性# 傳播屬性
他描述了事務解決巢狀問題的特徵
# 在開發**現的場景
在開發中,我們通常是service呼叫dao,並且在業務中絕大部分都滿足這種
但會出現service呼叫service,這是就有事務的巢狀了
# 出現的問題
在aservice()中呼叫了兩個bservice()和cservice()
如果在執行過程中,bservice()正常執行,且已提交。但在cservice()執行過程**現錯誤,需要回滾,但bservice()已經提交,無法回滾
傳播屬性級別
傳播屬性的值
外部不存在事務
外部存在事務
required(增刪改)
開啟新的事務
融合到外部事務中
supports(查詢)
不開啟新的事務
融合到外部事物中
唯讀屬性(readonly)
# 唯讀屬性
針對只進行查詢操作的業務方法,可以加入唯讀屬性,提供執行效率
# 預設值
false
超時屬性(timeout)# 超時屬性
指定了事務等待的最長時間
# 為什麼事務進行等待
當前事務訪問資料是,有可能訪問的資料被別的事務進行加鎖的處理,那麼此時本事務就必須進行等待
# 運用
@transactional(timeout = )
# 預設值
-1 (最終有對應的資料庫來指定)
異常屬性在spring事務處理過程中
預設 對於runtimeexception及其子類 採用的是回滾的策略
預設 對於exception及其子類 採用的是提交的策略
rollbackfor = exception設定為回滾
norollbackfor = runtimeexception設定為提交
資料庫事務
事件是訪問並可能更新各種資料項的乙個程式執行單元。事件由事務開始與事務結束之間執行的全體操作組成。為了保證資料完整性,資料庫系統需要維護事務的以下性質 原子性 atomicity 事務中的操作要麼全部成功,要麼全部失敗。一致性 consistency 事務執行前後要保持資料庫的一致性。隔離性 iso...
資料庫 事務
資料庫事務 database transaction 是指作為單個邏輯工作單元執行的一系列操作。事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向資料的資源。通過將一組相關操作組合為乙個要麼全部成功要麼全部失敗的單元,可以簡化錯誤恢復並使應用程式更加可靠。乙個邏輯工作單元要成...
資料庫事務
這段時間面試,由於基礎不是特別好,遇到一些要筆試的公司。就會表示出來 今天有人問我,資料庫事務 是什麼。我只感覺十分熟悉。但是又說不出所以然。回來找了一下,現在整理記錄 1 定義 資料庫事務 database transaction 是指作為單個邏輯工作單元執行的一系列操作。事務處理可以確保除非事務...