`
baobeituping
  • 浏览: 1068728 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

spring 控制事物

阅读更多

1.通过在编码中控制事物

  springContext.xml:

 ...

  <bean id="teamDaoImpl" class="com.dao.ObjDaoImpl">
  <property name="jdbcTemplate" ref="jdbcTemplate"></property>
  <property name="transactionTemplate">
   <bean class="org.springframework.transaction.support.TransactionTemplate">
    <property name="transactionManager" ref="transactionManager"></property>
   </bean>
  </property>
 </bean>
 
 
 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource">
            <ref bean="dataSource"/>
        </property>
 </bean>

<bean id="dataSource"
  class="org.apache.commons.dbcp.BasicDataSource">
  <property name="driverClassName"
   value="com.mysql.jdbc.Driver">
  </property>
  <property name="url" value="jdbc:mysql://127.0.0.1:3306/mydb"></property>
  <property name="username" value="root"></property>
  <property name="password" value="root"></property>
 </bean>

...

首先要配置一个事物管理器transactionManager,该事物管理器要配置是一个相应的数据源datasource。然后在teamDaoImpl中配置一个属性transactionManager。

 

JAVA代码:

package com.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionTemplate;

import com.vo.Team;

public class ObjDaoImpl implements ObjDao {

 private JdbcTemplate jdbcTemplate;
 
 private TransactionTemplate transactionTemplate;
 
 public TransactionTemplate getTransactionTemplate() {
  return transactionTemplate;
 }
 public void setTransactionTemplate(TransactionTemplate transactionTemplate) {
  this.transactionTemplate = transactionTemplate;
 }
 public JdbcTemplate getJdbcTemplate() {
  return jdbcTemplate;
 }
 public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
  this.jdbcTemplate = jdbcTemplate;
 }
 public void getMoney() {
  this.transactionTemplate.execute(
    new TransactionCallback(){
     public Object doInTransaction(TransactionStatus ts){
      try {
       System.out.println("过程一");
       System.out.println("过程二");
       System.out.println("过程三");
      } catch (Exception e) {
       ts.setRollbackOnly();
      }
      return null;
     }
    }
  );
  
 }
}

注释:添加事物的一种方法是利用spring的TransactionTemplate类,该类有一种回调机制,要想使用该类,必须从实现TransactionCallBack接口开始,由于该接口只有一个方法需要实现,因此可以把他作为一个匿名内部类来实现,将所需要作为实物来处理的代码,把他们放入 doInTransaction()即可。

调用TransactionTemplate的execute()方法,即执行包含在TransactionCallback事例里的代码。如果代码遇到了问题,则调用TransactionStatus对象的setRollbackOnly()方法来回滚整个事物。

在实现类中的TransactionTemplate是在配置文件中配置org.springframework.transaction.support.TransactionTemplate来实现的。

2.通过在applicationContext.xml中配置事物

 

...

<bean id="teamDaoImpl" class="com.dao.ObjDaoImpl">
  <property name="jdbcTemplate" ref="jdbcTemplate"></property>
  <property name="transactionTemplate">
   <bean class="org.springframework.transaction.support.TransactionTemplate">
    <property name="transactionManager" ref="transactionManager"></property>
   </bean>
  </property>
 </bean>


 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource">
            <ref bean="dataSource"/>
        </property>
 </bean>
 
 <bean id="teamProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  <property name="target" ref="teamDaoImpl"></property>
  <property name="proxyInterfaces" value="com.dao.ObjDao"></property>
  <property name="transactionManager" ref="transactionManager"></property>
  <property name="transactionAttributes">
   <props>
    <prop key="add*">PROPAGATION_REQUIRED</prop>
   </props>
  </property>
 </bean>

...

该配置文件定义了三个部分:

1.target:表示具体要代理的对象。

2.proxyInterfaces:表示代理对象所实现的接口

3.transactionManager:表示定义的事物管理器

<prop key="add*">PROPAGATION_REQUIRED</prop>
表示对teamDaoImpl中的ADD开头的方法添加事物。

SPRING定义了7种不同的传播行为。具体可以GOOGLE查下。

 

JAVA代码:

package com.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionTemplate;

import com.vo.Team;

public class ObjDaoImpl implements ObjDao {

 private JdbcTemplate jdbcTemplate;
 
 private TransactionTemplate transactionTemplate;
 
 public TransactionTemplate getTransactionTemplate() {
  return transactionTemplate;
 }
 public void setTransactionTemplate(TransactionTemplate transactionTemplate) {
  this.transactionTemplate = transactionTemplate;
 }
 public JdbcTemplate getJdbcTemplate() {
  return jdbcTemplate;
 }
 public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
  this.jdbcTemplate = jdbcTemplate;
 }
 public void save(Team team) {
  String sql = "insert into team (Name) values(?)";
  
  this.jdbcTemplate.update(sql,new Object[]{team.getName()});

 }
 public Team getTeamById(int id) {
  // TODO Auto-generated method stub
  String sql = "select id,name from team where id=?";
  List teams = this.jdbcTemplate.query(sql,new Object[]{Integer.valueOf(id)},new RowMapper(){
   public Object mapRow(ResultSet rs,int rowNum) throws SQLException,DataAccessException{
    Team team = new Team();
    team.setId(rs.getInt("id"));
    team.setName(rs.getString("name"));
    return team;
    
   }
  });
  return teams.size()>0?(Team)teams.get(0):null;
 }
 public void getMoney() {
  this.transactionTemplate.execute(
    new TransactionCallback(){
     public Object doInTransaction(TransactionStatus ts){
      try {
       System.out.println("过程一");
       System.out.println("过程二");
       System.out.println("过程三");
      } catch (Exception e) {
       ts.setRollbackOnly();
      }
      return null;
     }
    }
  );
  
 }
//通过在配置文件定义后,只对该方法添加了事物。

 public void addMoneyXml() {
  System.out.println("过程一");
  System.out.println("过程二");
  System.out.println("过程三");


 }

}

分享到:
评论

相关推荐

    spring-控制事物回滚

    "spring-控制事物回滚"这个主题主要涉及Spring如何在出现异常时自动或手动触发事务的回滚,以及如何配置和使用Spring的事务管理机制。我们将深入探讨Spring事务管理的原理、API使用以及在实际开发中的应用。 首先,...

    spring的5中事物配置 介绍spring的5中事物配置

    - 编程式事务管理允许在代码中直接控制事务的开始、提交、回滚等操作,使用`PlatformTransactionManager`接口和`TransactionDefinition`、`TransactionStatus`等类。这种方式虽然灵活,但侵入性较强,不推荐在业务...

    spring事务控制

    spring事务控制jar包,请网上自寻下载

    spring-控制事物

    标题中的“spring-控制事务”指的是Spring框架中的事务管理功能,这是Spring的核心特性之一,用于在多层架构中实现数据库事务的一致性和可靠性。在Java企业级应用开发中,事务管理是至关重要的,确保数据操作的原子...

    spring事物和rabbitMQ的例子

    Spring提供了一种声明式事务管理方式,使得开发者可以在不直接编写事务控制代码的情况下,通过配置来管理事务的边界。在"spring的2个数据源的配置"中,这意味着系统可能需要处理来自两个不同数据源的数据,例如一个...

    spring-tx事物源码

    在Spring框架中,事务管理是核心功能之一,它提供了对应用程序数据访问层的事务支持。Spring的事务管理机制包括编程式事务管理和声明式事务管理,这两种方式都基于`spring-tx`模块。在这个源码中,我们可以深入理解...

    Spring_事物的写法

    接下来,为了实现更灵活的事务控制,可以利用AOP的方式定义事务通知。具体而言,可以创建一个`tx:advice`元素来指定哪些方法应该被事务管理。例如,下面的配置表示所有以`add*`开头的方法都将采用REQUIRED传播行为:...

    Spring事物配置的五种模式

    ### Spring事务配置的五种模式详解 在Spring框架中,事务管理是十分重要的特性之一,它可以帮助开发者确保数据的一致性和完整性。对于不同的业务场景,Spring提供了多种事务配置的方式,以便于灵活应对各种需求。...

    spring中事物管理1

    总之,Spring 的事务管理机制使得开发者能够轻松地在应用中实现复杂的事务控制,保证了数据的一致性和可靠性,是企业级 Java 应用开发的重要组成部分。通过选择适当的事务管理器和定义事务属性,开发者可以有效地...

    spring事物传播测试表

    本文将深入探讨“Spring事物传播测试表”所涉及的知识点。 首先,理解事务是非常重要的。在数据库操作中,事务确保数据的一致性和完整性。例如,一组相关的数据库操作要么全部成功,要么全部失败,这就是事务的ACID...

    spring编程式事物

    标题"spring编程式事物"主要关注的是编程式事务管理。这种方式允许开发者通过`PlatformTransactionManager`接口和`TransactionDefinition`接口来控制事务的生命周期。在Spring中,通常使用`TransactionTemplate`或者...

    spring配置事物的5种方式

    3. **代理机制**:Spring通过代理机制实现事务控制,包括AOP(面向切面编程)代理和JDK动态代理。代理机制是决定事务策略的关键部分,它决定了事务如何在方法调用间传播。 接下来,我们将详述Spring配置事务的五种...

    Spring事务管理Demo

    这种方式灵活性高,但容易导致事务控制代码与业务逻辑混淆,不易维护。 2. **声明式事务管理**:这是Spring最常用的方式,通过在配置文件或者使用`@Transactional`注解来定义事务边界,使得事务管理与业务逻辑分离...

    spring ioc以及事物架构图

    其中,**IoC(Inversion of Control,控制反转)**与**DI(Dependency Injection,依赖注入)**是其核心特性之一。Spring通过IoC容器实现了对象的创建、管理和维护等功能,简化了Java应用的开发过程。 **IoC容器的...

    最新版本SpringCloud+seata+nacos实现全局事物处理的demo案例

    版本:springcloud 2021.0.1,springboot 2.6.4,seata 1.4.2,nacos 2.0.3 (其他所有依赖版本均为最新mybatis-plus,fegin等等......) 模拟订单和库存的一个简单案例实现,注册到nacos配置中心,通过feign远程调用...

    第八节-spring-事物源码解析1

    通过理解Spring事务的核心接口和相关概念,我们可以更好地控制和管理应用程序中的数据操作,确保数据的完整性和一致性。在实际开发中,通常结合声明式和编程式事务管理以达到最佳的事务处理效果。

    spring.net 声明式事物管理小示例

    Spring.NET 是一个基于 .NET Framework 的轻量...通过这个小示例,你将学习如何在 Spring.NET 中设置声明式事务管理,以及如何通过配置和注解控制事务的行为。这有助于创建更稳定、可扩展和易于维护的 .NET 应用程序。

    事物简单总结(偏向Spring事物)

    本文主要关注Spring框架中的事务管理,它提供了一种声明式和编程式的事务处理方式,使得开发者能够方便地在应用层面上控制事务。 首先,我们需要理解事务的基本概念。事务是数据库操作的基本单元,它包含一组操作,...

    Spring声明式事务配置模板2.x

    `@RollbackFor`和`@NoRollbackFor`用于控制哪些异常类型需要触发回滚或不触发回滚。 5. **action-servlet.xml**:虽然这个文件名通常与Struts2的配置关联,但在Spring MVC中,也可能包含关于Controller层的配置。在...

Global site tag (gtag.js) - Google Analytics