Spring中 事務基礎

2022-08-23 03:27:10 字數 2265 閱讀 2937

事務

事務是什麼?

(同生共死)

事務解決什麼問題?

簡單的提乙個小例子,就轉賬,先把你錢扣掉了,但中途發生點不可抗拒的因素,結果沒轉過去,那麼如果沒有回滾,那麼你就白白損失這錢,如果銀行先給那個人轉達了,但中途發生點問題,你的錢沒扣,那銀行損失慘重,所以這就需要事務,要麼都執行,要麼都不執行

事務的四個特性:

原子性:都要確保不可再分的最小單元

一致性:指的是結果要麼都成功提交,要麼都回滾,一致的

永續性:事務完成後,會永久的儲存到資料庫,而不是說你今天有,明天就沒了

隔離性:多個事務之間互不影響

併發事務會造成的問題:

第一類丟失更新:撤銷乙個事務時,把其他事務已提交的更新資料覆蓋。

第二類丟失更新:是不可重複讀的特殊情況。如果兩個事物都讀取同一行,然後兩個都進行寫操作,並提交,第乙個事物所做的改變就會丟失。

髒讀:乙個事務讀取到另乙個事務未提交的更新資料。

幻讀也叫虛讀:乙個事務執行兩次查詢,第二次結果集包含第一次中沒有或某些行已經被刪除的資料,造成兩次結果不一致,只是另乙個事務在這兩次查詢中間插入或刪除了資料造成的。

不可重複讀:乙個事務兩次讀取同一行的資料,結果得到不同狀態的結果,中間正好另乙個事務更新了該資料,兩次結果相異,不可被信任。

事物的四個

如何解決這些問題?answer:事物的隔離級別

① serializable (序列化):可避免髒讀、不可重複讀、幻讀的發生。

② repeatable read (可重複讀):可避免髒讀、不可重複讀的發生。

③ read committed (讀已提交):可避免髒讀的發生。

④ read uncommitted (讀未提交):最低級別,任何情況都無法保證。

其中sql server和oracle是讀已提交,mysql是可重複讀,他們隔離級別不同,效能也不同,隨然序列化避免的問題最多,但是效能太差,大多數時候要根據實際業務進行取捨

事務的七個傳播行為:

1、propagation_required:如果當前沒有事務,就建立乙個新事務,如果當前存在事務,就加入該事務,該設定是最常用的設定。

2、propagation_supports:支援當前事務,如果當前存在事務,就加入該事務,如果當前不存在事務,就以非事務執行。『

3、propagation_mandatory:支援當前事務,如果當前存在事務,就加入該事務,如果當前不存在事務,就丟擲異常。

4、propagation_requires_new:建立新事務,無論當前存不存在事務,都建立新事務。

5、propagation_not_supported:以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。

6、propagation_never:以非事務方式執行,如果當前存在事務,則丟擲異常。

7、propagation_nested:如果當前存在事務,則在巢狀事務內執行。如果當前沒有事務,則執行與propagation_required類似的操作。

在mysql中如何檢視事物的隔離級別:

select @@tx_isolation;
在mysql中如何修改事務的隔離級別:

set [global | session] transaction isolation level

如果寫global就是全域性

如果是session就是當前回話

Spring開發基礎之Spring事務管理

spring提供的事務管理 spring提供的事務管理可以分為兩類 程式設計式的和宣告式的。程式設計式的,比較靈活,但是 量大,存在重複的 比較多 宣告式的比程式設計式的更靈活。傳統使用jdbc的事務管理 以往使用jdbc進行資料操作,使用datasource,從資料來源中得到connection,...

spring中事務詳解

文章 使用步驟 步驟一 在spring配置檔案中引入命名空間 id defaulttransactionmanager class org.springframework.orm.hibernate3.hibernatetransactionmanager name sessionfactory r...

spring中事務配置

1 如果在方法 類 介面上使用註解的方式宣告事務,需要在配置檔案中進行配置,以便通知 spring 容器對標註 transactional 註解的 bean 加工處理。首先需要引入 tx 命名空間,2 transactional 註解可以被應用於介面定義和介面方法 類定義和類的 public 方法上...