資料庫 事務

2021-10-21 10:27:00 字數 4307 閱讀 1218

什麼是事務

保證業務操作完整性的一種資料庫機制
事務(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 是指作為單個邏輯工作單元執行的一系列操作。事務處理可以確保除非事務...