Spring 程式設計式事務和申明式事務選擇和使用小結
當你只有很少的事務操作時,程式設計式事務管理通常比較合適。例如,如果你有一個Web應用,其中只有特定的更新操作有事務要求,
你可能不願使用Spring或其他技術設定事務代理。這種情況下,使用 TransactionTemplate 可能是個好辦法。
只有程式設計式事務管理才能顯式的設定事務名稱。
另一方面,如果你的應用中存在大量事務操作,那麼宣告式事務管理通常是值得的。它將事務管理與業務邏輯分離, 而且在Spring中配置也不難。
我們的開發中,一般使用到事務的地方比較少,我覺得,程式設計式事務足夠了。
使用宣告式事務,對我們這種對速度要求較高的應用中。反而會帶來效能問題。
2:推薦事務處於一個較高層次,比如service上的某個函式(尤其是像我們這種sns而不像和錢掛鉤的金融系統,對資料精確性要求不是很高的的應用),
而底層的dao可以不考慮事務(一般情況下,資料庫自身的預設事務管理級別,就可以處理),否則可能會出現事務巢狀,增加程式複雜度。
事務往往和業務規緊密關聯,當業務邏輯發生改變,意味著dao的大幅度改動。系統規模達到一定程度,修改風險相當大。
Spring事務的好處是不更改現有的dao,僅需對現有的service bean 進行配置或者儘量少的修改就達到事務效果了。
同時,把事務統一在service層,系統結構更清晰。
一般情況下,通常我們使用到事務的地方一般類似如下場景:
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
protected void doInTransactionWithoutResult(TransactionStatus status) {
try {
updateOperation1();
updateOperation2();
} catch (SomeBusinessExeption ex) {
//通過呼叫 TransactionStatus 物件的 setRollbackOnly() 方法來回滾事務。
status.setRollbackOnly();
}
}
});
只有當兩個操作updateOperation1(),updateOperation2() 同時成功時,才會提交事務,如果有一個操作失敗,則事務回滾,保證資料的完整性。
達到了要麼把事件都執行,要麼都不執行的效果。
像我們現在使用的這種方式:
@Transactional
public int insert(...) {}
@Transactional
public int update(...) {}
我覺得可以不使用事務來保證它的正確性,”@Transactional“可以去除。
因為在dao層,而且操作都是針對資料庫的單一操作,要麼操作成功,要麼操作失敗,一般情況下,也不會出現資料不完整。
3 在程式碼中進行程式設計式事務管理:
首先在配置檔案中新增如下兩個bean,
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager" />
</bean>
public class SimpleService implements Service {
private final TransactionTemplate transactionTemplate;
public void setTransactionTemplate(TransactionTemplate transactionTemplate){
.....
}
.....
//如果需要返回值:
public Object someServiceMethod() {
return transactionTemplate.execute(new TransactionCallback() {
// the code in this method executes in a transactional context
public Object doInTransaction(TransactionStatus status) {
updateOperation1();
return resultOfUpdateOperation2();
}
});
}
//如果不需要返回值:
//回撥方法內的程式碼可以通過呼叫 TransactionStatus 物件的 setRollbackOnly() 方法來回滾事務。
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
protected void doInTransactionWithoutResult(TransactionStatus status) {
try {
updateOperation1();
updateOperation2();
} catch (SomeBusinessExeption ex) {
status.setRollbackOnly();
}
}
});
//諸如傳播模式、隔離等級、超時等等的事務設定都可以在TransactionTemplate中或者通過配置或者程式設計式地實現。如:
transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_READ_UNCOMMITTED);
transactionTemplate.setTimeout(30); // 30 seconds
<bean id="sharedTransactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="isolationLevelName" value="ISOLATION_READ_UNCOMMITTED"/>
<property name="timeout" value="30"/>
......
</bean>"
}
以上一定要注意,transactionTemplate 對應的資料來源,一定要和updateOperation1();updateOperation2();操作對應的資料來源相同。
如果不是同一個資料來源,就需要JTA 來管理不同資料庫之間的事務處理,情況就比較複雜了。
4 Spring中事務是比較難理解的一部分,如果大家想了解諸如傳播模式,隔離級別,髒讀,幻讀,不可重複讀等等,推薦一篇文章:
相關推薦
Spring 程式設計式事務和申明式事務選擇和使用小結
1.選擇程式設計式事務管理還是宣告式事務管理: 當你只有很少的事務操作時,程式設計式事務管理通常比較合適。例如,如果你有一個Web應用,其中只有特定的更新操作有事務要求,你可能不願使用Spring或其他技術設定事務代理。這種情況下,使用 TransactionTemp
【EfF】 貪婪載入和延遲載入 (virtual去掉關閉延遲載入) EntityFramework(EF)貪婪載入和延遲載入的選擇和使用
EntityFramework(EF)貪婪載入和延遲載入的選擇和使用 貪婪載入:顧名思議就是把所有要載入的東西一 次性讀取 1 using (var context = new MyDbContext()) 2 { 3 var orders = from o in context.Or
淺談spring事務管理的2種方式:程式設計式事務管理和宣告式事務管理;以及@Transactional(rollbackFor=Exception.class)註解用法
事務的概念,以及特性: 百度百科介紹: ->資料庫事務(Database Transaction) ,是指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。 事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向資料的資源。通過
Spring程式設計式事務管理和宣告式事務管理 案例
轉賬案例使用了Spring事務管理,用兩種方式實現:程式設計式事務管理和宣告式事物管理。 其中,程式設計式事務管理是一種手動修改程式碼的方式,比較麻煩,在開發過程中很少使用;宣告式事務管理有三種方法實現,分別是TransactionProxyFacto
spring支援程式設計式事務管理和宣告式事務管理兩種方式
1、宣告式事務提交,註解transaction,自動進行事務提交和回滾。 宣告式事務管理也有兩種常用的方式,一種是基於tx和aop名字空間的xml配置檔案,另一種就是基於@Transactional註解。2、程式設計式事務管理,在程式碼中顯示進行事務提交及回滾。原文:h
Spring程式設計式和宣告式事務例項講解
開發十年,就只剩下這套架構體系了! >>>
Spring筆記(4) - Spring的程式設計式事務和宣告式事務詳解
一.背景 事務管理對於企業應用而言至關重要。它保證了使用者的每一次操作都是可靠的,即便出現了異常的訪問情況,也不至於破壞後臺資料的完整性。就像銀行的自助取款機,通常都能正常為客戶服務,但是也難免遇到操作過程中機器突然出故障的情況,此時,事務就必須確保出故障前對賬戶的操作不生效,就像使用者剛才完全沒有使用過取
Spring 程式設計式事務 宣告式事務
程式設計式事務通用類: import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.datasource.DataSourceTransactionManager
使用Spring程式設計式事務TransactionTemplate
使用場景 假如有一個專案設定了資料庫最大連線數為3,然後專案中提供了一個介面,介面中的一個方法會做以下邏輯處理:①首先在資料庫的某個表中查詢出一條記錄,②然後利用該條記錄的資料去調第三方的介面,然後第三方介面放回資料,③最後修改該條記錄的某個欄位的資料然後更新回資料庫。 假設有4個使
spring 程式設計式事務 (spring事務一)
配置檔案 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org
事務宣告宣告式事務和程式設計式事務介紹
事務宣告宣告式事務和程式設計式事務介紹 轉載出處 https://blog.csdn.net/u013083576/article/details/51754567 程式設計式事務:所謂程式設計式事務指的是通過編碼方式實現事務,即類似於JDBC程式設計實現事務管理。管理使用Transacti
手寫Spring註解事務(利用AOP技術 + 註解 + Spring程式設計式事務)
1.參考下面的文章搭建一個無事務管理的SSM操作資料庫的框架 Spring 使用Druid資料來源 整合 Mybatis 2.AOP技術參考 AOP技術應用實現 3.第一步首先實現Sprin
Spring 申明式事務&事務的傳播行為
之前的部落格講述了,為什麼要有事務?https://blog.csdn.net/qq_37591637/article/details/85207922 現在呢?就在原有的基礎上怎麼新增事務,使得整個過程只要有一個地方出問題就失敗,整個過程的成功才叫成功! 換句話說,如果書的庫存夠,賬戶
JdbcTemplate和宣告式事務(Spring框架)
import java.sql.SQLException; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.sql.DataSource; import org.junit.Test;
Spring程式設計式事務的使用
引入事務管理器 @Autowired TransactionTemplate transactionTemplate; @Autowired PlatformTransactionManager
Spring的四種事務管理(一種程式設計式事務+三種宣告事務)
Spring的4種事務管理(1種程式設計式事務+三種宣告事務) 一、Spring事務的介紹 二、程式設計式事務xml的配置 注入後直接在service層呼叫模板的方法使用 三、基於AOP方式的宣告式事務管理 prop的具體配置
筆記——spring基本使用(控制反轉IOC、面向切面程式設計AOP、宣告式事務,事務隔離級別、事務傳播)
spring溫習筆記 Spring是一個開放原始碼的設計層面框架,他解決的是業務邏輯層和其他各層的鬆耦合問題,因此它將面向介面的程式設計思想貫穿整個系統應用。 Spring 的控制反轉IOC、面向切面程式設計AOP等特性不多說。 本文核心內容:搭建一個Spring Dem
Spring的4種事務管理(1種程式設計式事務+三種宣告事務)
Spring的4種事務管理(1種程式設計式事務+三種宣告事務) · TransactionTemplate可以實現程式設計式事務 · Spring使用AOP來實現宣告式事務 一、Spring事務的介紹 二、程式設計式事務xml的配置 配置spri
spring 註解 事務和宣告式事務共存的情況下如何決定先後順序
首先先看配置檔案: [html] view plain copy print?<!– hibernate –> <beanid=“sessionFactory” class=“org.springframework.orm.hibernate3.LocalSessi
Spring程式設計式事務管理
在基於資料庫的應用中,事務是非常重要的。為了方便使用,Spring提供了基於XML和基於註解的方式配置事務,思路都是使用AOP,在特定的切入點統一開啟事務,以方法為粒度進行事務控制。並且定義了事務的傳播屬性,規定了配置了事務的方法互相巢狀呼叫時的行為準則: PROPAG