一.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. Oracle 正则表达式函数-REGEXP_LIKE 使用例子

    原文在这 戳 REGEXP_LIKE 3个参数 第一个是输入的字符串 第二个是正则表达式 第三个是取值范围: i:大小写不敏感: c:大小写敏感: n:点号 . 不匹配换行符号: m:多行模式: x: ...

  2. jQ HTML之捕获 设置 元素添加与删除

    捕获 设置修改 添加元素 删除元素

  3. 安装第三方库出现 Python version 2.7 required, which was not found in the registry

    安装第三方库出现 Python version 2.7 required, which was not found in the registry 建立一个文件 register.py 内容如下. 然 ...

  4. SQL2005中的事务与锁定(四)- 转载

    ------------------------------------------------------------------------ -- Author : HappyFlyStone - ...

  5. 前端Html和Css面试题

    前端Html和Css面试题Html篇:1.你做的页面在哪些流览器测试过?这些浏览器的内核分别是什么? IE: trident内核 Firefox:gecko内核 Safari:webkit内核 Ope ...

  6. SpringMVC框架的基础知识;

    首先 在javaEE环境下,建立一个动态的web工程: 导入架包.... 建立一对多映射关系的封装类,这儿只写属性,getter和setter方法就不写了: 1: private String pro ...

  7. 微信JS SDK PHP Demo

    一.JSSDK类定义 <?php class JSSDK { private $appId; private $appSecret; public function __construct($a ...

  8. NSDate获取当前时区的时间

    [NSDate date]获取的是GMT时间,要想获得某个时区的时间,以下代码可以解决这个问题 NSDate *date = [NSDate date]; NSTimeZone *zone = [NS ...

  9. JavaEE程序员必读图书大推荐

    下面是我根据多年的阅读和实践经验,给您推荐的一些图书: 第一部分: Java语言篇 1 <Java编程规范> 星级: 适合对象:初级,中级 介绍:作者James Gosling(Java之 ...

  10. python(二)数据类型

    一.整数 创建方法 i = 10 i = int(10) i = int("10",base=2)  #“”中是几进制的表示,base是选择要表示的进制,如base=2,用2进制的 ...