Spring聲明式事務之NameMatchAtttirbuteSource
系統
2315 0
首先介紹下spring的事務傳播規則和隔離級別
PROPAGATION_REQUIRED
如果存在一個事務,則支持當前事務。如果沒有事務則開啟一個新的事務。
PROPAGATION_SUPPORTS
如果存在一個事務,支持當前事務。如果沒有事務,則非事務的執行。但是對于事務同步的事務管理器,PROPAGATION_SUPPORTS與不使用事務有少許不同。
PROPAGATION_MANDATORY
如果已經存在一個事務,支持當前事務。如果沒有一個活動的事務,則拋出異常。
?
PROPAGATION_REQUIRES_NEW
總是開啟一個新的事務。如果一個事務已經存在,則將這個存在的事務掛起。
PROPAGATION_NOT_SUPPORTED
總是非事務地執行,并掛起任何存在的事務。
PROPAGATION_NEVER
總是非事務地執行,如果存在一個活動事務,則拋出異常
PROPAGATION_NESTED
如果一個活動的事務存在,則運行在一個嵌套的事務中. 如果沒有活動事務, 則按TransactionDefinition.PROPAGATION_REQUIRED 屬性執
PROPAGATION_NESTED 與PROPAGATION_REQUIRES_NEW的區別
:它們非常類似,都像一個嵌套事務,如果不存在一個活動的事務,都會開啟一個新的事務。使用PROPAGATION_REQUIRES_NEW時,內層事務與外層事務就像兩個獨立的事務一樣,一旦內層事務進行了提交后,外層事務不能對其進行回滾。兩個事務互不影響。兩個事務不是一個真正的嵌套事務。同時它需要JTA事務管理器的支持。
使用PROPAGATION_NESTED時,外層事務的回滾可以引起內層事務的回滾。而內層事務的異常并不會導致外層事務的回滾,它是一個真正的嵌套事務。DataSourceTransactionManager使用savepoint支持PROPAGATION_NESTED時,需要JDBC 3.0以上驅動及1.4以上的JDK版本支持。其它的JTA TrasactionManager實現可能有不同的支持方式。
PROPAGATION_REQUIRED應該是我們首先的事務傳播行為。它能夠滿足我們大多數的事務需求。
?
在TransactionDefinition接口中定義了五個不同的事務隔離級別
ISOLATION_DEFAULT
這是一個PlatfromTransactionManager默認的隔離級別,使用數據庫默認的事務隔離級別.另外四個與JDBC的隔離級別相對應
ISOLATION_READ_UNCOMMITTED
這是事務最低的隔離級別,它充許別外一個事務可以看到這個事務未提交的數據。這種隔離級別會產生臟讀,不可重復讀和幻像讀。
ISOLATION_READ_COMMITTED
保證一個事務修改的數據提交后才能被另外一個事務讀取。另外一個事務不能讀取該事務未提交的數據。這種事務隔離級別可以避免臟讀出現,但是可能會出現不可重復讀和幻像讀。
ISOLATION_REPEATABLE_READ
這種事務隔離級別可以防止臟讀,不可重復讀。但是可能出現幻像讀。它除了保證一個事務不能讀取另一個事務未提交的數據外,還保證了避免下面的情況產生(不可重復讀)。
ISOLATION_SERIALIZABLE
這是花費最高代價但是最可靠的事務隔離級別。事務被處理為順序執行。除了防止臟讀,不可重復讀外,還避免了幻像讀。
我們使用TransactionProxyFactoryBean完成spring的事務管理,他有一個屬性是transactionAttributeSource,這個屬性被定義成為一個TransactionAttributeSource實例
我們現在的目的是讓courseService類的enrollStudentInCourse被spring進行事務控制,配置文件如下:
?
<
bean?
id
="dataSource"
?class
="org.springframework.jdbc.datasource.DriverManagerDataSource"
>
??????
<
property?
name
="driverClassName"
>
?????????
<
value
>
com.sybase.jdbc3.jdbc.SybDriver
</
value
>
???????
</
property
>
???????
<
property?
name
="url"
>
?????????
<
value
>
jdbc:sybase:Tds:192.168.0.10:4100/DB_CENTER?charset=eucgb
&
jconnect_version=4
?????????
</
value
>
???????
</
property
>
???????
<
property?
name
="username"
>
?????????
<
value
>
sa
</
value
>
???????
</
property
>
???????
<
property?
name
="password"
>
?????????
<
value
></
value
>
???????
</
property
>
???
</
bean
>
????
<
bean?
id
="TransactionManager"
?class
="org.springframework.jdbc.datasource.DataSourceTransactionManager"
>
?????????
<
property?
name
="dataSource"
>
?????????????
<
ref?
bean
="dataSource"
/>
?????????
</
property
>
????
</
bean
>
?
????
<
bean?
id
="sessionFactory"
????????class
="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
>
????????
<
property?
name
="dataSource"
>
????????????
<
ref?
local
="dataSource"
?
/>
????????
</
property
>
????????
<
property?
name
="hibernateProperties"
>
????????????
<
props
>
????????????????
<
prop?
key
="hibernate.dialect"
>
????????????????????org.hibernate.dialect.SybaseDialect
????????????????
</
prop
>
????????????????
<
prop?
key
="hibernate.show_sql"
>
false
</
prop
>
????????????????
<
prop?
key
="hibernate.cache.use_query_cache"
>
true
</
prop
>
????????????????
<
prop?
key
="hibernate.cache.provider_class"
>
????????????????????org.hibernate.cache.HashtableCacheProvider
????????????????
</
prop
>
????????????
</
props
>
????????
</
property
>
????????
<
property?
name
="mappingResources"
>
???????????
<
list
>
?????????????
<
value
>
com/bjjdsy/ky/zl/domain/ZlStationTab.hbm.xml
</
value
>
???????????
</
list
>
????????
</
property
>
????
</
bean
>
????
<!--
?以下是事務配置?
-->
????
????
<
bean?
id
="transactionAttributeSource"
?class
="org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource"
>
???????
<
property?
name
="properties"
>
??????????
<
props
>
????????????
<
prop?
key
="enrollStudentInCourse"
>
???????????????PROPAGATION_REQUIRES_NEW,ISOLATION_REPEATABLE_READ,readonly,-CourseException?
<!--
?表示當拋出CourseException時進行回滾,用減號表示,加號表示拋出異常仍可進行提交?
-->
????????
????????????
</
prop
>
??????????
</
props
>
???????
</
property
>
????
</
bean
>
????
????
<
bean?
id
="courseService"
?class
="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
>
??????
<
property?
name
="proxyInterfaces"
>
????????
<
value
>
com.test.CourseService
</
value
>
??????
</
property
>
??????
<
property?
name
="target"
>
????????
<
value
>
courseServiceImpl
</
value
>
??????
</
property
>
??????
<
property?
name
="transactionManager"
>
????????
<
ref?
bean
="TransactionManager"
/>
??????
</
property
>
??????
<
property?
name
="trainsactionAttributeSource"
>
????????
<
ref?
bean
="transactionAttributeSource"
/>
??????
</
property
>
????
</
bean
>
?
我們也可以使用通配符進行操作,改動如下:
?
?
<
bean?
id
="transactionAttributeSource"
?class
="org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource"
>
???????
<
property?
name
="properties"
>
??????????
<
props
>
????????????
<
prop?
key
="enroll*"
>
???????????????PROPAGATION_REQUIRES_NEW,ISOLATION_REPEATABLE_READ,readonly,-CourseException?
<!--
?表示當拋出CourseException時進行回滾,用減號表示,加號表示拋出異常仍可進行提交?
-->
????????
????????????
</
prop
>
??????????
</
props
>
???????
</
property
>
????
</
bean
>
?
除此之外,我們還有一種名稱匹配事務的捷徑,這種方式不再使用trainsactionAttributeSource而使用transactionAttributes
類似如下定義Bean
?
??
<
bean?
id
="stationManager"
?class
="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
>
???????
<
property?
name
="transactionManager"
>
??????????
<
ref?
bean
="transactionManager"
></
ref
>
???????
</
property
>
??????
<
property?
name
="target"
>
??????????
<
bean?
class
="com.bjjdsy.ky.zl.service.StationServiceImpl"
>
????????????
<
property?
name
="stationDAO"
>
????????????????
<
ref?
bean
="StationDAO"
/>
???????????
</
property
>
??????????
</
bean
>
??????
</
property
>
??????
<
property?
name
="transactionAttributes"
>
????????
<
props
>
??????????
<
prop?
key
="save*"
>
PROPAGATION_REQUIRED
</
prop
>
??????????
<
prop?
key
="list*"
>
PROPAGATION_REQUIRED,readOnly
</
prop
>
??????????
<
prop?
key
="delete*"
>
PROPAGATION_REQUIRED
</
prop
>
??????????
<
prop?
key
="get*"
>
PROPAGATION_REQUIRED,readOnly
</
prop
>
??????????
<
prop?
key
="edit*"
>
PROPAGATION_REQUIRED
</
prop
>
??????????
<
prop?
key
="search*"
>
PROPAGATION_REQUIRED
</
prop
>
???????
</
props
>
?????
</
property
>
????
</
bean
>
Spring聲明式事務之NameMatchAtttirbuteSource使用
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元