Ⅰ 編程式事務和聲明式事務的區別
編程式事務:所謂編程式事務指的是通過編碼方式實現事務,即類似於JDBC編程實現事務管理。管理使用TransactionTemplate或者直接使用底層的PlatformTransactionManager。對於編程式事務管理,spring推薦使用TransactionTemplate。
聲明式事務:管理建立在AOP之上的。其本質是對方法前後進行攔截,然後在目標方法開始之前創建或者加入一個事務,在執行完目標方法之後根據執行情況提交或者回滾事務。聲明式事務最大的優點就是不需要通過編程的方式管理事務,這樣就不需要在業務邏輯代碼中摻雜事務管理的代碼,只需在配置文件中做相關的事務規則聲明(或通過基於@Transactional註解的方式),便可以將事務規則應用到業務邏輯中。
顯然聲明式事務管理要優於編程式事務管理,這正是spring倡導的非侵入式的開發方式。
聲明式事務管理使業務代碼不受污染,一個普通的POJO對象,只要加上註解就可以獲得完全的事務支持。和編程式事務相比,聲明式事務唯一不足地方是,後者的最細粒度只能作用到方法級別,無法做到像編程式事務那樣可以作用到代碼塊級別。但是即便有這樣的需求,也存在很多變通的方法,比如,可以將需要進行事務管理的代碼塊獨立為方法等等。
擴展:
Spring對編程式事務的支持
Spring中的事務分為物理事務和邏輯事務;
物理事務:就是底層資料庫提供的事務支持,如JDBC或JTA提供的事務;
邏輯事務:是Spring管理的事務,不同於物理事務,邏輯事務提供更豐富的控制,而且如果想得到Spring事務管理的好處,必須使用邏輯事務,因此在Spring中如果沒特別強調一般就是邏輯事務;
邏輯事務解決方案:
低級別解決方案:
使用工具類獲取連接(會話)和釋放連接(會話),如使用org.springframework.jdbc.datasource包中的DataSourceUtils 類來獲取和釋放具有邏輯事務功能的連接。當然對集成第三方ORM框架也提供了類似的工具類,如對Hibernate提供了SessionFactoryUtils工具類,JPA的EntityManagerFactoryUtils等,
高級別解決方案:
使用Spring提供的模板類,如JdbcTemplate、HibernateTemplate和JpaTemplate模板類等,而這些模板類內部其實是使用了低級別解決方案中的工具類來管理連接或會話
Spring提供兩種編程式事務支持:直接使用PlatformTransactionManager實現和使用TransactionTemplate模板類,用於支持邏輯事務管理。如果採用編程式事務推薦使用TransactionTemplate模板類和高級別解決方案
Ⅱ spring的事務如何配置
spring的聲明式事務配置: 1. <!-- 配置sessionFactory --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation"> <value>/WEB-INF/classes/hibernate.cfg.xml</value> </property> </bean> 2. 配置事務管理器 <!-- 配置事務管理器 --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref local="sessionFactory" /> </property> </bean> 3. 配置事務特性 <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="add*" propagation="REQUIRED"/> <tx:method name="update*" propagation="REQUIRED"/> <tx:method name="del*" propagation="REQUIRED"/> <tx:method name="*" read-only="true"/> </tx:attributes> </tx:advice> 4. 配置哪些類的哪些方法配置事務 <aop:config> <aop:pointcut id="allManagerMethod" ession="execution(* com.yyaccp.service.impl.*.*(..))"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod"> </aop:config>
Ⅲ jfinal聲明式事務怎樣配置
5.7 聲明式事務
ActiveRecord支持聲明式事務,聲明式事務需要使用ActiveRecordPlugin提供的攔截器來實現,攔截器的配置方法見Interceptor有關章節。以下代碼是聲明式事務示例:
//本例僅為示例,並未嚴格考慮賬戶狀態等業務邏輯
@Before(Tx.class)
publicvoidtrans_demo(){
//獲取轉賬金額
IntegertransAmount=getParaToInt("transAmount");
//獲取轉出賬戶id
IntegerfromAccountId=getParaToInt("fromAccountId");
//獲取轉入賬戶id
IntegertoAccountId=getParaToInt("toAccountId");
//轉出操作
Db.update("updateaccountsetcash=cash-?whereid=?",
transAmount,fromAccountId);
//轉入操作
Db.update("updateaccountsetcash=cash+?whereid=?",
transAmount,toAccountId);
}
以上代碼中,僅聲明了一個Tx攔截器即為action添加了事務支持。除此之外ActiveRecord還配備了TxByActionKeys、TxByActionKeyRegex、TxByMethods、TxByMethodRegex,分別支持actionKeys、actionKey正則、actionMethods、actionMethod正則聲明式事務,以下是示例代碼:
publicvoidconfigInterceptor(Interceptorsme){
me.add(newTxByMethodRegex("(.*save.*|.*update.*)"));
me.add(newTxByMethods("save","update"));
me.add(newTxByActionKeyRegex("/trans.*"));
me.add(newTxByActionKeys("/tx/save","/tx/update"));
}
上例中的TxByRegex攔截器可通過傳入正則表達式對action進行攔截,當actionKey被正則匹配上將開啟事務。TxByActionKeys可以對指定的actionKey進行攔截並開啟事務,TxByMethods可以對指定的method進行攔截並開啟事務。
注意:MySql資料庫表必須設置為InnoDB引擎時才支持事務,MyISAM並不支持事務。
網頁鏈接
Ⅳ Spring的聲明式事務處理怎麼配置,可以在提交事務後關閉資料庫連接
try {
conn = u.getConnection();//連接資料庫
//業務層的處理方法的調用。。。。。。
u.commit(conn);//提交
} catch (Exception e) {
u.rollback(conn);
} finally {
u.close(conn);//關閉
}
Ⅳ SpringBoot如何註解事務聲明式事務
springboot的事務也主要分為兩大類,
一是xml聲明式事務,
二是註解事務,註解事務也可以實現類似聲明式事務的方法,
springboot 之 xml事務
使用 @ImportResource("classpath:transaction.xml") 引入該xml的配置
springboot 註解事務
Transactional註解事務
註:需要在進行事物管理的方法上添加註解@Transactional,或者偷懶的話直接在類上面添加該註解
註解聲明式事務
@Configuration
public class TxConfigBeanName {
@Autowired
private DataSourceTransactionManager transactionManager;
// 創建事務通知
@Bean(name = "txAdvice")
public TransactionInterceptor getAdvisor() throws Exception {
Properties properties = new Properties();
properties.setProperty("get*", "PROPAGATION_REQUIRED,-Exception,readOnly");
properties.setProperty("add*", "PROPAGATION_REQUIRED,-Exception,readOnly");
properties.setProperty("save*", "PROPAGATION_REQUIRED,-Exception,readOnly");
properties.setProperty("update*", "PROPAGATION_REQUIRED,-Exception,readOnly");
properties.setProperty("delete*", "PROPAGATION_REQUIRED,-Exception,readOnly");
TransactionInterceptor tsi = new TransactionInterceptor(transactionManager,properties);
return tsi;
}
@Bean
public BeanNameAutoProxyCreator txProxy() {
BeanNameAutoProxyCreator creator = new BeanNameAutoProxyCreator();
creator.setInterceptorNames("txAdvice");
creator.setBeanNames("*Service", "*ServiceImpl");
creator.setProxyTargetClass(true);
return creator;
}
}
Ⅵ 編程式事務與聲明式事務的區別是什麼
編程式事務是自己寫事務處理的類,然後調用
聲明式事務是在配置文件中配置,一般搭配在框架裡面使用!
Ⅶ 什麼叫做spring的聲明式事務
事物管理對於企業應用來說是至關重要的,好使出現異常情況,它也可以保證數據的一致性。
spring支持編程式事務管理和聲明式事務管理兩種方式。
編程式事務管理使用TransactionTemplate或者直接使用底層的PlatformTransactionManager。對於編程式事務管理,spring推薦使用TransactionTemplate。
聲明式事務管理建立在AOP之上的。其本質是對方法前後進行攔截,然後在目標方法開始之前創建或者加入一個事務,在執行完目標方法之後根據執行情況提交或者回滾事務。聲明式事務最大的優點就是不需要通過編程的方式管理事務,這樣就不需要在業務邏輯代碼中摻雜事務管理的代碼,只需在配置文件中做相關的事務規則聲明(或通過基於@Transactional註解的方式),便可以將事務規則應用到業務邏輯中。
顯然聲明式事務管理要優於編程式事務管理,這正是spring倡導的非侵入式的開發方式。聲明式事務管理使業務代碼不受污染,一個普通的POJO對象,只要加上註解就可以獲得完全的事務支持。和編程式事務相比,聲明式事務唯一不足地方是,後者的最細粒度只能作用到方法級別,無法做到像編程式事務那樣可以作用到代碼塊級別。但是即便有這樣的需求,也存在很多變通的方法,比如,可以將需要進行事務管理的代碼塊獨立為方法等等。
聲明式事務管理也有兩種常用的方式,一種是基於tx和aop名字空間的xml配置文件,另一種就是基於@Transactional註解。顯然基於註解的方式更簡單易用,更清爽。
spring事務特性
spring所有的事務管理策略類都繼承自org.springframework.transaction.PlatformTransactionManager介面
其中TransactionDefinition介面定義以下特性:
事務隔離級別
隔離級別是指若干個並發的事務之間的隔離程度。TransactionDefinition 介面中定義了五個表示隔離級別的常量:
TransactionDefinition.ISOLATION_DEFAULT:這是默認值,表示使用底層資料庫的默認隔離級別。對大部分資料庫而言,通常這值就是TransactionDefinition.ISOLATION_READ_COMMITTED。
TransactionDefinition.ISOLATION_READ_UNCOMMITTED:該隔離級別表示一個事務可以讀取另一個事務修改但還沒有提交的數據。該級別不能防止臟讀,不可重復讀和幻讀,因此很少使用該隔離級別。比如PostgreSQL實際上並沒有此級別。
TransactionDefinition.ISOLATION_READ_COMMITTED:該隔離級別表示一個事務只能讀取另一個事務已經提交的數據。該級別可以防止臟讀,這也是大多數情況下的推薦值。
TransactionDefinition.ISOLATION_REPEATABLE_READ:該隔離級別表示一個事務在整個過程中可以多次重復執行某個查詢,並且每次返回的記錄都相同。該級別可以防止臟讀和不可重復讀。
TransactionDefinition.ISOLATION_SERIALIZABLE:所有的事務依次逐個執行,這樣事務之間就完全不可能產生干擾,也就是說,該級別可以防止臟讀、不可重復讀以及幻讀。但是這將嚴重影響程序的性能。通常情況下也不會用到該級別。
事務傳播行為
所謂事務的傳播行為是指,如果在開始當前事務之前,一個事務上下文已經存在,此時有若干選項可以指定一個事務性方法的執行行為。在TransactionDefinition定義中包括了如下幾個表示傳播行為的常量:
TransactionDefinition.PROPAGATION_REQUIRED:如果當前存在事務,則加入該事務;如果當前沒有事務,則創建一個新的事務。這是默認值。
TransactionDefinition.PROPAGATION_REQUIRES_NEW:創建一個新的事務,如果當前存在事務,則把當前事務掛起。
TransactionDefinition.PROPAGATION_SUPPORTS:如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續運行。
TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事務方式運行,如果當前存在事務,則把當前事務掛起。
TransactionDefinition.PROPAGATION_NEVER:以非事務方式運行,如果當前存在事務,則拋出異常。
TransactionDefinition.PROPAGATION_MANDATORY:如果當前存在事務,則加入該事務;如果當前沒有事務,則拋出異常。
TransactionDefinition.PROPAGATION_NESTED:如果當前存在事務,則創建一個事務作為當前事務的嵌套事務來運行;如果當前沒有事務,則該取值等價於TransactionDefinition.PROPAGATION_REQUIRED。
事務超時
所謂事務超時,就是指一個事務所允許執行的最長時間,如果超過該時間限制但事務還沒有完成,則自動回滾事務。在 TransactionDefinition 中以 int 的值來表示超時時間,其單位是秒。
默認設置為底層事務系統的超時值,如果底層資料庫事務系統沒有設置超時值,那麼就是none,沒有超時限制。
事務只讀屬性
只讀事務用於客戶代碼只讀但不修改數據的情形,只讀事務用於特定情景下的優化,比如使用Hibernate的時候。
默認為讀寫事務。
「只讀事務」並不是一個強制選項,它只是一個「暗示」,提示資料庫驅動程序和資料庫系統,這個事務並不包含更改數據的操作,那麼JDBC驅動程序和資料庫就有可能根據這種情況對該事務進行一些特定的優化,比方說不安排相應的資料庫鎖,以減輕事務對資料庫的壓力,畢竟事務也是要消耗資料庫的資源的。
但是你非要在「只讀事務」裡面修改數據,也並非不可以,只不過對於數據一致性的保護不像「讀寫事務」那樣保險而已。
因此,「只讀事務」僅僅是一個性能優化的推薦配置而已,並非強制你要這樣做不可
spring事務回滾規則
指示spring事務管理器回滾一個事務的推薦方法是在當前事務的上下文內拋出異常。spring事務管理器會捕捉任何未處理的異常,然後依據規則決定是否回滾拋出異常的事務。
默認配置下,spring只有在拋出的異常為運行時unchecked異常時才回滾該事務,也就是拋出的異常為RuntimeException的子類(Errors也會導致事務回滾),而拋出checked異常則不會導致事務回滾。可以明確的配置在拋出那些異常時回滾事務,包括checked異常。也可以明確定義那些異常拋出時不回滾事務。還可以編程性的通過setRollbackOnly()方法來指示一個事務必須回滾,在調用完setRollbackOnly()後你所能執行的唯一操作就是回滾。
Ⅷ spring的聲明式事務 在哪個xml文件配置
hibernate的事務管理方式僅僅就是託管給JDBC(如果用JTA那麼就是JTA) 而JDBC的一切行為包括事務是基於一個connection的,那麼hibernate委託給JDBC的事務也就是基於一個session。JTA與JDBC事務不同在於可以跨連接。spring也是調用hibernate中事務管理的API, hibernate的事務管理,一般是編程性的, 而委託給spring之後,可以使用聲明式的,也就是可以在XML之中配置哪些需要進行事務管理,哪些不需要.
Ⅸ spring的聲明式事務怎麼配置
這是聲明式事物里的註解式事物配置
<!-- 事務管理器 -->
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 事務註解驅動,標注@Transactional的類和方法將具有事務性 -->
<tx:annotation-driven transaction-manager="txManager" />
Ⅹ 聲明式 跟spring aop管理事務有什麼不同
聲明式就是提前指派,在為某些包,類,方法,指定好受事物管理,需要再配置文件中配置
編程式就是程序員在程序里自由發揮,啟動事物管理了,aop是面向切面編程,把程序執行的過程看成一條連貫的線,aop就是在指定的點切一刀,凡是經過這點的操作都必須先執行aop定義好的操作,好處就是在不影響原程序的情況下,方便的加入或刪除附加的邏輯處理操作,比如日誌記錄,許可權控制等
編程式事務與聲明式事務的區別是什麼?
編程式事務是自己寫事務處理的類,然後調用
聲明式事務是在配置文件中配置,一般搭配在框架裡面使用!
聲明式事務
聲明式事務(declarative transaction management)是Spring提供的對程序事務管理的方式之一。
Spring的聲明式事務顧名思義就是採用聲明的方式來處理事務。這里所說的聲明,就是指在配置文件中申明。用在Spring配置文件中聲明式的處理事務來代替代碼式的處理事務。這樣的好處是,事務管理不侵入開發的組件,具體來說,業務邏輯對象就不會意識到正在事務管理之中,事實上也應該如此,因為事務管理是屬於系統層面的服務,而不是業務邏輯的一部分,如果想要改變事務管理策劃的話,也只需要在定義文件中重新配置即可;在不需要事務管理的時候,只要在設定文件上修改一下,即可移去事務管理服務,無需改變代碼重新編譯,這樣維護起來極其方便。
Spring使用AOP來完成聲明式的事務管理,因而聲明式事務是以方法為單位,Spring的事務屬性自然就在於描述事務應用至方法上的策略,在Spring中事務屬性有以下四個參數:
1.傳播行為
2.隔離級別
3.只讀提示
4.事務超時期間