一.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. Objective-C基础

    1.C语言面向过程,OC面向对象 2.第一个OC程序 #import <Foundation/Foundation.h> int main(int argc, const char * a ...

  2. 本地yum库制作及本地安装Docker

    生产环境中,我们总是会遇到服务器无法连接外网的情况,这样,如果想安装某个应用,而这个应用依赖的其他类库又特别多,就很痛苦了.这个时候,就需要自己制作个本地的yum库,进行本地安装.本文将以Docker ...

  3. Mac下安装LNMP(Nginx+PHP5.6)环境

    [转自:http://avnpc.com/pages/install-lnmp-on-osx] 安装Homebrew 最近工作环境切换到Mac,所以以OS X Yosemite(10.10.1)为例, ...

  4. Eclipse安装SVN插件方式简明介绍

    一.Links安装: 推荐使用此种安装方式,因为它便于插件的管理. 在eclipse根目录下新建文件夹links,这样就得到了eclipse\links 在eclipse\links下新建一个link ...

  5. 简单练习题2编写Java应用程序。首先定义一个描述银行账户的Account类,包括成员变 量“账号”和“存款余额”,成员方法有“存款”、“取款”和“余额查询”。其次, 编写一个主类,在主类中测试Account类的功能

    编写Java应用程序.首先定义一个描述银行账户的Account类,包括成员变 量“账号”和“存款余额”,成员方法有“存款”.“取款”和“余额查询”.其次, 编写一个主类,在主类中测试Account类的 ...

  6. ssh 免密码登录

    1.在本机下生成公钥/私钥对. ssh-keygen -t rsa -P '' -P表示密码,-P '' 就表示空密码,也可以不用-P参数,这样就要三车回车,用-P就一次回车.它在/home/yaoy ...

  7. [CCF] Z字形扫描

    CCF Z字形扫描 感觉和LeetCode中的ZigZag还是有一些不一样的. 题目描述 在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag Scan).给定一个n×n的矩阵,Z ...

  8. 【UML】如何记忆UML类图的画法

    前言 UML类图形象反映系统类之间的关系,大家非常常用.小弟不才,偶尔使用,往往每次使用都得查询各种关系的表示方式.终于,这次认真看了几遍,打算记起来. 注意 记忆方法只是本人联想,用于加强记忆.与该 ...

  9. 【leetcode❤python】 28. Implement strStr()

    #-*- coding: UTF-8 -*- #题意:大海捞刀,在长字符串中找出短字符串#AC源码:滑动窗口双指针的方法class Solution(object):    def strStr(se ...

  10. TextInfo

    https://msdn.microsoft.com/en-us/library/system.globalization.textinfo.totitlecase(v=vs.110).aspx Co ...