一.Spring配置文件如下:

<bean id="test" class="org.apache.commons.dbcp.BasicDataSource">
  <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
  <property name="url"   value="jdbc:oracle:thin:@192.168.1.192:1521:test" />
  <property name="username" value="test" />
  <property name="password" value="test" />
  <property name="initialSize" value="5" />
  <property name="maxActive" value="10" />
 </bean>

<!--transactionManager -->
 <bean id="transactionManager"
  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="test" />
 </bean>

<bean id="baseTxProxy"
  class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
  lazy-init="true">
  <property name="transactionManager">
   <ref bean="transactionManager" />
  </property>
  <property name="transactionAttributes">
   <props>
    <prop key="*">PROPAGATION_REQUIRED</prop>
   </props>
  </property>
 </bean>

<bean id="test_jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
  <property name="dataSource">
   <ref bean="test" />
  </property>
 </bean>

<!-- manage Dao -->
 <bean id="testImpDao"
  class="com.test.dao.TestImpDao">
  <property name="jdbcTemplate">
   <ref bean="test_jdbcTemplate" />
  </property>
 </bean>
 
 <!-- transaction services -->
 <bean id="testService" parent="baseTxProxy">
  <property name="target">
   <bean
    class=com.test.service.TestServiceImp">
    <property name="testImpDao">
     <ref bean="testImpDao" />
    </property>
   </bean>
  </property>
 </bean>

二.实现类简单说明:

1.DAO的接口

public interface ITestDAO {

public void   insertTable1();

public void  insertTable2();

public void  insertTable3();

}

2.DAO的实现

public class ImpTestDAO implements ITestDAO{

public void   insertTable1(){
          this.getJdbcTemplate().update(sb.toString(),paraObjectArray);  
       }

public void  insertTable2(){
          this.getJdbcTemplate().update(sb.toString(),paraObjectArray);  
       }

public void  insertTable3(){
          this.getJdbcTemplate().update(sb.toString(),paraObjectArray);  
       }

}

3.service的接口层:

public interface ITestService {
    public String saveOperate(String params);
}

4.service的实现层

public class TestServiceImp implements ITestService{   
  private TestDAO  testDAO;   
   
  public void setTestDAO(TestDAO   testDAO){   
     this.testDAO=testDAO;   
 }   
     
 
  public void  saveOperate(){   
    this.testDAO.insertTable1();   
    this.testDAO.insertTable2();   
    this.testDAO.insertTable3();   
 }       
}

5.前台的调用,如:aciton层l

public String saveOperate(String params) {
  String returnStr = "";
  StringBuffer errorSb = new StringBuffer("[");
  try {
    WebApplicationContext appContext=WebApplicationContextUtils.    
                     getWebApplicationContext(this.getServlet().getServletContext());
   ITestService Service = (ITestService) appContext
     .getBean("testService");
   returnStr = Service.saveOperate(params);
  }// 如果执行失败,把具体的异常信息输出,并且回滚相应的事务;
  catch (Exception e) {
   errorSb.append("{result:error,");
   errorSb.append("info:"" + e.getMessage() + ""}");
   errorSb.append("]");
   returnStr = errorSb.toString();
  }

return returnStr;
 }

碰到的问题:在DAO的实现层,把jdbc的操作异常抛到service的实现层--即:'TestServiceImp'类中时,

自己写了try{}catch(){},在方法中把异常给处理了,出现事务无法回滚的错误。

备注: 经过调试,发现TestDaoImp中的JDBC操作时,当执行出错时不需要对异常进行特殊处理,

而是应该把异常抛出到service的实现类中后,在service的实现类中也不需要对该异常出处理,

而是要把该异常抛出调用serviceImp的类中(如:相应的aciton),这样

<bean id="testService" parent="baseTxProxy">,这个代理类才能捕获到JDBC抛出的异常,才能根据对应的异常进行判断是否要进行事务的回滚操作.

Spring控制多张表的提交事务操作的更多相关文章

  1. 关于spring boot多张表建立外健的讨论

    现在有四张表:student(学生表).blogs(博客表).comment(评论表).reply(回复表) 现在说一下这四张表: student(学生表):学生的信息记录表 blogs(博客表):学 ...

  2. 夺命雷公狗---DEDECMS----31dedecms数据库创建一张表完成curl操作

    首先我们创建一张测试表,格式如下所示: 然后我们还是在plus目录下创建一个test3.php进行测试,首先写一个添加的: <?php header("Content-Type:tex ...

  3. 记录一则FGA审计“A用户对B用户某张表的更新操作”需求

    环境:Oracle 11.2.0.4 我这里测试A用户为JINGYU,要审计的表为B用户SCOTT下的EMP表.通过FGA来实现. 1.添加审计策略 2.测试审计效果 3.控制审计策略 1.添加审计策 ...

  4. goldengate 过滤对某张表的复制操作

    在复制进程中配置下面的参数可以实现对一个用户下的某些表进行过滤,在复制的时候 不做任何操作. MAPEXCLUDE: Valid for Replicat Use the MAPEXCLUDE par ...

  5. MySQL实例多库某张表数据文件损坏导致xxx库无法访问故障恢复

    一.问题发现 命令行进入数据库实例手动给某张表进行alter操作,发现如下报错. mysql> use xx_xxx; No connection. Trying to reconnect... ...

  6. 实现多个ContentProvider对多张表进行操作

    http://blog.csdn.net/maylian7700/article/details/7365373 SQLite数据库直接操作类: DatabaseHelper.java package ...

  7. 一起学Hadoop——实现两张表之间的连接操作

    ---恢复内容开始--- 之前我们都是学习使用MapReduce处理一张表的数据(一个文件可视为一张表,hive和关系型数据库Mysql.Oracle等都是将数据存储在文件中).但是我们经常会遇到处理 ...

  8. (10)MySQL触发器(同时操作两张表)

    什么是触发器 触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合.触发器的这种特性可以协助应用在数据库端确保数据的完整性. 举个例子,比如你现在有两个表[用户表]和[日志 ...

  9. android 玩转ContentProvider之二--实现多个ContentProvider对多张表进行操作

    SQLite数据库直接操作类: DatabaseHelper.java package com.jacp.database; import android.content.Context; impor ...

随机推荐

  1. [学习Vulkan之一] 初识Vulkan

    Vulkan是Khronos组织制定的"下一代"开放的图形显示API,是与DirectX12可以匹敌的GPU API标准.Vulkan是基于AMD的Mantle API演化而来,目 ...

  2. 1029-c语言文法的理解

    <程序>→<外部声明>|<程序><外部声明> <外部声明>→<函数定义>|<声明> <函数定义>→< ...

  3. 12个css高级技巧.html

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. jsp中用EL读取了数据库里面的时间,怎么设置格式显示的格式

    首先导入标签 <%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%> < ...

  5. SQL语句中:UNION与UNION ALL的区别

    有些人看到题目,瞬间觉得楼主也太弱了吧,这种问题也要拿出来写,这种问题 随便会点sql 的人基本都会 Union   是会删除冗余数据 Union ALL 不会删除冗余数据 将所有的结果都展现给用户 ...

  6. 搭建android开发环境

    任何一个程序的开端都要从搭建开发环境开始,这样你就可以进行实战练习了,并且搭建完后即快速来一个项目HelloWorld, 哈哈,话不多说了,进入正题 android环境的安装主要分3步骤: 1.下载和 ...

  7. 虚拟主机无法使用fsockopen操作处理方法

    一.如何禁用fsockopen()下面是两种常用的禁用fsockopen的方法.1.修改php.ini,将 disable_functions = 后加入 fsockopen2.修改php.ini,将 ...

  8. Linux之grep命令详解

    简介 grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它 ...

  9. linux线程的实现【转】

    转自:http://www.cnblogs.com/zhaoyl/p/3620204.html 首先从OS设计原理上阐明三种线程:内核线程.轻量级进程.用户线程 内核线程 内核线程就是内核的分身,一个 ...

  10. Python之控制台输入密码的方法

    一.raw_input()或input(): for python 2.x [root@master test]# /usr/local/python2.7/bin/python test.py Pl ...