Spring事務管理

2021-08-16 23:47:13 字數 1431 閱讀 9204

在過去的乙個多星期裡,我一直在清理一些使用spring和hibernate的遺留**,以在sql資料庫中儲存和處理資料。**是有效的,但是它沒有遵循面向服務的體系結構的嚴格原則,因為有幾個地方spring和hibernate沒有按照預期的那樣做,並且需要實現一些變通方法。由於我們的程式設計師越來越多,所以我想要確保所有的東西都遵守規則,而且很容易更新,所以我必須要學習很多過去我所忽略的東西。

通過谷歌搜尋,我發現了兩個寶貴的資源,我需要予以稱讚:

以下是我從我所經歷的一切中提煉出來的東西:

@transactional註解只適用於公共方法。如果您有乙個帶有這個註解的private或protected的方法,那麼對於spring aop來說,想看到這個註解幾乎是不可能的。要想找到它們並不那麼難,所以要確保所有的註解方法都是public修飾的。

只有在適當的註解方法(見上)通過spring**呼叫時才會建立事務邊界。這意味著需要通過@autowired bean去呼叫注釋的方法,否則事務永遠不會啟動。如果您在乙個沒有註解的@autowired bean上呼叫乙個方法,它本身就呼叫了乙個公共方法,該方法被注釋掉了,您的注釋將被忽略。這是因為spring aop只是在第一次輸入@autowired**時檢查注釋。

不要盲目地相信您的@transactional註解實際上是在建立事務邊界。讓我們帶著疑問來測試一下事務是否真的處於活動狀態

第乙個問題是,**並沒有被正確註解,如下:

/**

* this code example is bad code, do not use it!

*/class nonworkingmyclass

@transactional

private void calledsecond()

}

在這種情況下,在呼叫nonworkingmyclass.calledfirst(),它將呼叫calledsecond(),然後嘗試更新名稱字段。即使你的xml配置正確設定了,但它也將不在事務中,name欄位會成功修改。這可能導致併發問題,而且直到出現問題時才會發現問題。

這裡是正確版本:

/**

* this code example works

*/class workingmyclass

private void calledsecond()

}

現在,當去掉用workingmyclass.calledfirst(),它將在事務中並且也正確遵守了事務的邊界,完成你所期望的動作。

起初以為事務沒有生效,做了方法public、@tranctional註解放到呼叫方法的最外層、spring junit測試、通過action去呼叫等測試

1、spring事務機制

***+aop

2、spring宣告式事務何時不會生效?

同類中呼叫方法

private

補充

Spring事務管理

spring是ssh中的管理員,負責管理其它框架,協調各個部分的工作。今天一起學習一下spring的事務管理。spring的事務管理分為宣告式跟程式設計式。宣告式就是在spring的配置檔案中進行相關配置 程式設計式就是用註解的方式寫到 裡。下面先說宣告式 spring配置檔案中關於事務配置總是由三...

spring事務管理

一 xml配置事務 二 註解的方式配置事務 bean id txmanaager class org.springframework.orm.hibernate3.hibernatetransactionmanager property name sessionfactory ref session...

spring 事務管理

和資料庫打交道的碼農都知道事務,事務有4大特徵,分別是原子性,一致性,隔離性,永續性。而spring 對事物提供了良好的支援,和api,通過簡單的配置,則可以減低程式設計師重複的操作。1.原子性 原子性指的是乙個事務內的所有操作要麼全部應用到資料庫,要麼取消對資料庫的操作。2.一致性 一致性和原子性...