前言
成都創(chuàng)新互聯(lián)專注于壺關(guān)企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站,商城開發(fā)。壺關(guān)網(wǎng)站建設(shè)公司,為壺關(guān)等地區(qū)提供建站服務(wù)。全流程按需搭建網(wǎng)站,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
spring事務(wù)管理包含兩種情況,編程式事務(wù)、聲明式事務(wù)。而聲明式事務(wù)又包括基于注解@Transactional和tx+aop的方式。那么本文先分析編程式注解事務(wù)和基于注解的聲明式事務(wù)。 編程式事務(wù)管理使用TransactionTemplate或者PlatformTransactionManager。對于編程式事務(wù)spring推薦使用TransactionTemplate。
一、編程式事務(wù)
spring事務(wù)特性
spring中所有的事務(wù)策略類都繼承自org.springframework.transaction.PlatformTransactionManager接口
public interface PlatformTransactionManager { TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException; void commit(TransactionStatus status) throws TransactionException; void rollback(TransactionStatus status) throws TransactionException; }
編程式事務(wù)TransactionTemplate需要手動在代碼中處理事務(wù),一般不推薦使用,也不符合spring的思想,因?yàn)樗苯玉詈洗a,但各有利弊。先看下TransactionTemplate的源碼。
public class TransactionTemplate extends DefaultTransactionDefinition implements TransactionOperations, InitializingBean { protected final Log logger = LogFactory.getLog(getClass()); private PlatformTransactionManager transactionManager; public TransactionTemplate() { } public TransactionTemplate(PlatformTransactionManager transactionManager) { this.transactionManager = transactionManager; } public TransactionTemplate(PlatformTransactionManager transactionManager, TransactionDefinition transactionDefinition) { super(transactionDefinition); this.transactionManager = transactionManager; } public void setTransactionManager(PlatformTransactionManager transactionManager) { this.transactionManager = transactionManager; } public PlatformTransactionManager getTransactionManager() { return this.transactionManager; } @Override public void afterPropertiesSet() { if (this.transactionManager == null) { throw new IllegalArgumentException("Property 'transactionManager' is required"); } } @Override public <T> T execute(TransactionCallback<T> action) throws TransactionException { if (this.transactionManager instanceof CallbackPreferringPlatformTransactionManager) { return ((CallbackPreferringPlatformTransactionManager) this.transactionManager).execute(this, action); } else { TransactionStatus status = this.transactionManager.getTransaction(this); T result; try { result = action.doInTransaction(status); } catch (RuntimeException ex) { // Transactional code threw application exception -> rollback rollbackOnException(status, ex); throw ex; } catch (Error err) { // Transactional code threw error -> rollback rollbackOnException(status, err); throw err; } catch (Throwable ex) { // Transactional code threw unexpected exception -> rollback rollbackOnException(status, ex); throw new UndeclaredThrowableException(ex, "TransactionCallback threw undeclared checked exception"); } this.transactionManager.commit(status); return result; } } private void rollbackOnException(TransactionStatus status, Throwable ex) throws TransactionException { logger.debug("Initiating transaction rollback on application exception", ex); try { this.transactionManager.rollback(status); } catch (TransactionSystemException ex2) { logger.error("Application exception overridden by rollback exception", ex); ex2.initApplicationException(ex); throw ex2; } catch (RuntimeException ex2) { logger.error("Application exception overridden by rollback exception", ex); throw ex2; } catch (Error err) { logger.error("Application exception overridden by rollback error", ex); throw err; } } }
從上面的代碼可以看到核心方法是execute,該方法入?yún)ransactionCallback<T>。查看TransactionCallback源碼:
public interface TransactionCallback<T> { T doInTransaction(TransactionStatus status); }
那么以上兩個(gè)源碼可以確定我們使用編程式事務(wù)管理的方式也就是自己需要重寫doInTransaction()。OK,那么我們手動使用TransactionTemplate處理下。
1、先配置transactionmanager
<!--事務(wù)管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean>
2、配置transactionTemplate
<!--編程式事務(wù),推薦使用TransactionTemplate--> <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate"> <property name="transactionManager" ref="transactionManager"/> </bean>
3、業(yè)務(wù)代碼處理
@Autowired private TransactionTemplate transactionTemplate; public int insertUser2(final User user) { Integer i= (Integer) this.transactionTemplate.execute(new TransactionCallback() { public Object doInTransaction(TransactionStatus transactionStatus) { int i = userMapper.insertUser(user); if (i > 0) { System.out.println("success"); } int j = 10 / 0; return i; } }); return i; }
業(yè)務(wù)代碼中我們使用by zero的異常故意拋出,你會發(fā)現(xiàn)能繼續(xù)打印success,當(dāng)你斷點(diǎn)debug時(shí),你會發(fā)現(xiàn)數(shù)據(jù)庫一直是鎖定狀態(tài),直到你程序執(zhí)行完。如下圖:
二、基于Transactional注解的事務(wù)管理
當(dāng)前應(yīng)該是使用最清爽的事務(wù)管理方式了,也符合spring的理念,非入侵代碼的方式。
1、配置
<!--事務(wù)管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 使用注解事務(wù),需要添加Transactional注解屬性 --> <tx:annotation-driven transaction-manager="transactionManager"/> <!--啟用最新的注解器、映射器--> <mvc:annotation-driven/>
2、配置后只需要在要處理的地方加上Transactional注解,而且Transactional注解的方式可以應(yīng)用在類上,也可以應(yīng)用在方法上,當(dāng)然只針對public方法。
3、業(yè)務(wù)代碼處理
@Transactional public int insertUser(User user) { int i = userMapper.insertUser(user); if (i > 0) { System.out.println("success"); } int j = 10 / 0; return i; }
總結(jié)
以上所述是小編給大家介紹的SpringMVC+MyBatis 事務(wù)管理,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對創(chuàng)新互聯(lián)網(wǎng)站的支持!
本文標(biāo)題:SpringMVC+MyBatis事務(wù)管理(實(shí)例)
標(biāo)題URL:http://aaarwkj.com/article44/igdche.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計(jì)公司、商城網(wǎng)站、營銷型網(wǎng)站建設(shè)、移動網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、面包屑導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)