事務相關知識點

2021-09-22 12:31:54 字數 2519 閱讀 1925

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

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

隔離性(isolation):隔離性是指在併發操作中,不同事務之間應該隔離開來,使每個併發中的事務不會相互干擾。

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

傳播行為

意義propergation_mandatory

表示方法必須執行在乙個事務中,如果當前事務不存在,就丟擲異常

propagation_nested

表示如果當前事務存在,則方法應該執行在乙個巢狀事務中。否則,它看起來和 propagation_required 看起來沒什麼倆樣

propagation_never

表示方法不能執行在乙個事務中,否則丟擲異常

propagation_not_supported

表示方法不能執行在乙個事務中,如果當前存在乙個事務,則該方法將被掛起

propagation_required

表示當前方法必須執行在乙個事務中,如果當前存在乙個事務,那麼該方法執行在這個事務中,否則,將建立乙個新的事務

propagation_requires_new

表示當前方法必須執行在自己的事務中,如果當前存在乙個事務,那麼這個事務將在該方法執行期間被掛起

propagation_supports

表示當前方法不需要執行在乙個是事務中,但如果有乙個事務已經存在,該方法也可以執行在這個事務中

在運算元據時可能帶來 3 個***,分別是髒讀、不可重複讀、幻讀。為了避免這 3 中***的發生,在標準的 sql 語句中定義了 4 種隔離級別,分別是未提交讀、已提交讀、可重複讀、可序列化(序列化)。

三種事務併發問題

髒讀:讀取到另乙個事務未提交資料;

不可重複讀:兩次讀取不一致;另一事務對該記錄做了修改

幻讀(虛讀):讀到另一事務已提交資料。對同一張表的兩次查詢不一致,因為另一事務插入了一條資料。例如查詢班級總數第一次查詢到50人,第二次查詢到51人,後來的人可能遲到了。

四大隔離級別

隔離級別

意義serializable(序列化)

不會出現任何併發問題,因為他是對同一資料的訪問是序列的,非併發訪問的;效能最差

repeatable_read(可重複讀)(mysql)

防止髒讀和不可重讀讀,不能處理幻讀問題;效能比serializable好

read_committed(讀已提交資料)(oracle)

防止髒讀,沒有處理不可重複讀和幻讀;效能比repeatable_read好

read_uncommitted (讀未提交事務)

可能出現任何事務併發問題;效能最好

而在 spring 事務中提供了 5 種隔離級別來對應在 sql 中定義的 4 種隔離級別,如下:

隔離級別

意義isolation_default

使用後端資料庫預設的隔離級別

isolation_serializable

這種隔離級別是所有的事務都在乙個執行佇列中,依次順序執行,而不是並行(對應可序列化)。可以避免髒讀、不可重複讀、幻讀。但是這種隔離級別效率很低,因此,除非必須,否則不建議使用。

isolation_repeatable_read

乙個事務不可能更新由另乙個事務修改但尚未提交(回滾)的資料(對應可重複讀)。可以避免髒讀和不可重複讀,但無法避免幻讀

isolation_read_committed

允許在乙個事務中讀取另乙個已經提交的事務中的資料(對應已提交讀)。可以避免髒讀,但是無法避免不可重複讀和幻讀

isolation_read_uncommitted

允許讀取未提交的資料(對應未提交讀),可能導致髒讀、不可重複讀、幻讀

事務開始邊界與結束邊界

開始邊界(con.setautocommit(false)),結束邊界(con.commit()或con.rollback());

如果在乙個事務中所有關於資料庫的操作都是唯讀的,也就是說,這些操作只讀取資料庫中的資料,而並不更新資料,那麼應將事務設為唯讀模式( read_only_marker ) , 這樣更有利於資料庫進行優化 。

因為唯讀的優化措施是事務啟動後由資料庫實施的,因此,只有將那些具有可能啟動新事務的傳播行為 (propagation_nested 、 propagation_required 、 propagation_required_new) 的方法的事務標記成唯讀才有意義。

如果乙個事務長時間執行,這時為了盡量避免浪費系統資源,應為這個事務設定乙個有效時間,使其等待數秒後自動回滾。與設定「唯讀」屬性一樣,事務有效屬性也需要給那些具有可能啟動新事物的傳播行為的方法的事務標記成唯讀才有意義。

事務 相關知識點

1.關閉自動提交功能。2.演示事務 裡面的事務,主要是針對連線來的。1.通過 x.setautocommit false 來關閉自動提交的設定。2.提交事務 x.commit 3.回滾事務 x.rollback test public void testtransaction catch sqlex...

事務的相關知識點

一件事情有n個組成單元 要不這n個組成單元同時成功 要不n個單元就同時失敗,就是將n個組成單元放到乙個事務中。開啟事務 start transaction 提交 commit 回滾 rollback 開啟事務 conn.setautocommit false 提交事務 conn.commit 回滾 ...

spring事務的相關知識點

4 事務管理失效的情況 所謂spring事務的傳播屬性,就是定義多個事務同時存在的時候,spring應該如何處理這些事務的行為。簡單來講就是 乙個開啟事務的方法執行在另乙個開啟了事務的方法中是,當前方法是開啟乙個新的事物還是使用同乙個事務 這些屬性在transactiondefinition中定義,...