SpringMVC+MyBatis 事务管理(实例)

作者:garfieldzf 时间:2022-07-30 11:04:40 

前言

        spring事务管理包含两种情况,编程式事务、声明式事务。而声明式事务又包括基于注解@Transactional和tx+aop的方式。那么本文先分析编程式注解事务和基于注解的声明式事务。 编程式事务管理使用TransactionTemplate或者PlatformTransactionManager。对于编程式事务spring推荐使用TransactionTemplate。

一、编程式事务

     spring事务特性

     spring中所有的事务策略类都继承自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;
}

     编程式事务TransactionTemplate需要手动在代码中处理事务,一般不推荐使用,也不符合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,该方法入参TransactionCallback<T>。查看TransactionCallback源码:


public interface TransactionCallback<T> {
T doInTransaction(TransactionStatus status);
}

那么以上两个源码可以确定我们使用编程式事务管理的方式也就是自己需要重写doInTransaction()。OK,那么我们手动使用TransactionTemplate处理下。

1、先配置transactionmanager


<!--事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
 <property name="dataSource" ref="dataSource"/>
</bean>

2、配置transactionTemplate


<!--编程式事务,推荐使用TransactionTemplate-->
<bean id="transactionTemplate"
  class="org.springframework.transaction.support.TransactionTemplate">
 <property name="transactionManager" ref="transactionManager"/>
</bean>

3、业务代码处理


@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;
}

  业务代码中我们使用by zero的异常故意抛出,你会发现能继续打印success,当你断点debug时,你会发现数据库一直是锁定状态,直到你程序执行完。如下图:

SpringMVC+MyBatis 事务管理(实例)

二、基于Transactional注解的事务管理

    当前应该是使用最清爽的事务管理方式了,也符合spring的理念,非入侵代码的方式。

1、配置


<!--事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
 <property name="dataSource" ref="dataSource"/>
</bean>
<!-- 使用注解事务,需要添加Transactional注解属性 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!--启用最新的注解器、映射器-->
<mvc:annotation-driven/>

2、配置后只需要在要处理的地方加上Transactional注解,而且Transactional注解的方式可以应用在类上,也可以应用在方法上,当然只针对public方法。

3、业务代码处理


@Transactional
public int insertUser(User user) {
 int i = userMapper.insertUser(user);
 if (i > 0) {
  System.out.println("success");
 }
 int j = 10 / 0;
 return i;
}

总结

以上所述是小编给大家介绍的SpringMVC+MyBatis 事务管理网站的支持!

来源:http://www.cnblogs.com/sword-successful/p/7274929.html

标签:springmvc,mybatis,事务管理
0
投稿

猜你喜欢

  • java生成图片验证码实例代码

    2022-01-06 04:01:37
  • 浅谈java中守护线程与用户线程

    2023-11-26 20:46:41
  • 一文了解Java读写锁ReentrantReadWriteLock的使用

    2023-10-12 19:28:21
  • MTK Android平台开发流程

    2023-06-23 08:59:11
  • Spring Boot + Mybatis-Plus实现多数据源的方法

    2023-11-13 15:01:46
  • Studio 编译报错:compileSdkVersion 'android-24' requires JDK 1.8 or later to compile.的解决办法

    2023-06-19 17:19:41
  • Java中实现双数组Trie树实例

    2023-03-19 15:12:38
  • springboot整合mybatis实现数据库的更新批处理方式

    2023-11-29 07:08:37
  • Java 程序设计总复习题(java基础代码)

    2022-05-11 07:02:31
  • Spring @Bean注解的使用场景与案例实现

    2023-11-20 04:44:22
  • Java实现三子棋小游戏

    2022-09-12 01:27:20
  • 关于Java集合框架面试题(含答案)上

    2021-06-02 13:29:44
  • sqlite数据库的介绍与java操作sqlite的实例讲解

    2023-05-09 03:07:40
  • Mybatis一对多查询的两种姿势(值得收藏)

    2023-07-01 00:20:08
  • Android 如何实现动态申请权限

    2023-07-30 00:51:31
  • Spring MVC入门_动力节点Java学院整理

    2023-11-03 20:35:31
  • 解决nacos项目启动报错:Connection refused: no further informa问题

    2023-08-16 16:55:41
  • Java对zip,rar,7z文件带密码解压实例详解

    2023-11-29 05:08:32
  • JDK1.8下载、安装和环境配置超详细教程(最新最完整)

    2022-07-22 12:58:34
  • 兼容Spring Boot 1.x和2.x配置类参数绑定的工具类SpringBootBindUtil

    2023-11-03 05:35:06
  • asp之家 软件编程 m.aspxhome.com