欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringMVC+MyBatis 事務(wù)管理(實例)

 更新時間:2017年08月02日 17:32:27   作者:garfieldzf  
本文先分析編程式注解事務(wù)和基于注解的聲明式事務(wù)。對SpringMVC+MyBatis 事務(wù)管理的相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧

前言

        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的思想,因為它直接耦合代碼,但各有利弊。先看下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);
}

 那么以上兩個源碼可以確定我們使用編程式事務(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)你斷點debug時,你會發(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ù)管理,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • maven項目打包上傳到私有倉庫

    maven項目打包上傳到私有倉庫

    在項目開發(fā)中通常會引用其他的jar,怎樣把自己的項目做為一個jar包的形式發(fā)布到私服倉庫中,本文就詳細(xì)的介紹一下,感興趣的可以了解一下
    2021-06-06
  • SpringBoot Cache緩存概念講解

    SpringBoot Cache緩存概念講解

    這篇文章主要介紹了Springboot cache緩存,使用緩存最關(guān)鍵的一點就是保證緩存與數(shù)據(jù)庫的數(shù)據(jù)一致性,本文給大家介紹最常用的緩存操作模式,對Springboot cache緩存操作流程感興趣的朋友一起看看吧
    2022-12-12
  • Java 10 局部變量類型推斷淺析

    Java 10 局部變量類型推斷淺析

    這篇文章主要介紹了Java 10 局部變量類型推斷淺析,Java 10 引進(jìn)一種新的閃閃發(fā)光的特性叫做局部變量類型推斷。文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,,需要的朋友可以參考下
    2019-06-06
  • Java Stream流零基礎(chǔ)教程

    Java Stream流零基礎(chǔ)教程

    Java8的另一大亮點Stream,它與java.io包里的InputStream和OutputStream是完全不同的概念,下面這篇文章主要給大家介紹了關(guān)于Java8中Stream詳細(xì)使用方法的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • 詳解SpringBoot應(yīng)用服務(wù)啟動與安全終止

    詳解SpringBoot應(yīng)用服務(wù)啟動與安全終止

    這篇文章主要介紹了SpringBoot應(yīng)用服務(wù)啟動與安全終止,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 使用Java和PostgreSQL存儲向量數(shù)據(jù)的實現(xiàn)指南

    使用Java和PostgreSQL存儲向量數(shù)據(jù)的實現(xiàn)指南

    在當(dāng)今的數(shù)字化時代,數(shù)據(jù)存儲的方式和技術(shù)正變得越來越復(fù)雜和多樣化,隨著機器學(xué)習(xí)和數(shù)據(jù)科學(xué)的發(fā)展,向量數(shù)據(jù)的存儲和管理變得尤為重要,本文將詳細(xì)介紹如何使用 Java 和 PostgreSQL 數(shù)據(jù)庫來存儲向量數(shù)據(jù),需要的朋友可以參考下
    2024-09-09
  • Spring框架基于AOP實現(xiàn)簡單日志管理步驟解析

    Spring框架基于AOP實現(xiàn)簡單日志管理步驟解析

    這篇文章主要介紹了Spring框架基于AOP實現(xiàn)簡單日志管理步驟解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • Servlet實現(xiàn)共享數(shù)據(jù)JavaWeb組件的幾種方法

    Servlet實現(xiàn)共享數(shù)據(jù)JavaWeb組件的幾種方法

    本文將結(jié)合實例代碼,介紹Servlet實現(xiàn)共享數(shù)據(jù)JavaWeb組件的幾種方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • java多線程之Balking模式介紹

    java多線程之Balking模式介紹

    大家好,本篇文章主要講的是java多線程之Balking模式介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • Springboot集成minio實現(xiàn)文件存儲的實現(xiàn)代碼

    Springboot集成minio實現(xiàn)文件存儲的實現(xiàn)代碼

    MinIO?是一款基于Go語言的高性能對象存儲服務(wù),本文主要介紹了Springboot集成minio實現(xiàn)文件存儲的實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03

最新評論