Spring控制多张表的提交事务操作
一.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控制多张表的提交事务操作的更多相关文章
- 关于spring boot多张表建立外健的讨论
现在有四张表:student(学生表).blogs(博客表).comment(评论表).reply(回复表) 现在说一下这四张表: student(学生表):学生的信息记录表 blogs(博客表):学 ...
- 夺命雷公狗---DEDECMS----31dedecms数据库创建一张表完成curl操作
首先我们创建一张测试表,格式如下所示: 然后我们还是在plus目录下创建一个test3.php进行测试,首先写一个添加的: <?php header("Content-Type:tex ...
- 记录一则FGA审计“A用户对B用户某张表的更新操作”需求
环境:Oracle 11.2.0.4 我这里测试A用户为JINGYU,要审计的表为B用户SCOTT下的EMP表.通过FGA来实现. 1.添加审计策略 2.测试审计效果 3.控制审计策略 1.添加审计策 ...
- goldengate 过滤对某张表的复制操作
在复制进程中配置下面的参数可以实现对一个用户下的某些表进行过滤,在复制的时候 不做任何操作. MAPEXCLUDE: Valid for Replicat Use the MAPEXCLUDE par ...
- MySQL实例多库某张表数据文件损坏导致xxx库无法访问故障恢复
一.问题发现 命令行进入数据库实例手动给某张表进行alter操作,发现如下报错. mysql> use xx_xxx; No connection. Trying to reconnect... ...
- 实现多个ContentProvider对多张表进行操作
http://blog.csdn.net/maylian7700/article/details/7365373 SQLite数据库直接操作类: DatabaseHelper.java package ...
- 一起学Hadoop——实现两张表之间的连接操作
---恢复内容开始--- 之前我们都是学习使用MapReduce处理一张表的数据(一个文件可视为一张表,hive和关系型数据库Mysql.Oracle等都是将数据存储在文件中).但是我们经常会遇到处理 ...
- (10)MySQL触发器(同时操作两张表)
什么是触发器 触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合.触发器的这种特性可以协助应用在数据库端确保数据的完整性. 举个例子,比如你现在有两个表[用户表]和[日志 ...
- android 玩转ContentProvider之二--实现多个ContentProvider对多张表进行操作
SQLite数据库直接操作类: DatabaseHelper.java package com.jacp.database; import android.content.Context; impor ...
随机推荐
- 用Unity开发HTC VIVE——手柄控制篇
写这篇文章的原因主要是因为现在虚拟现实非常的火爆但目前主流的虚拟现实设备(HTC VIVE)的教程却少的可怜,这个我深有体会.所以,我想将我平时开发中遇到的问题以及解决方法记录下来,分享给大家,若其中 ...
- CsvHelper
写66666行两个数字 用CsvHelper里的ExcelSerializer 400ms SaveAs 200ms 共600ms 直接用StreamWriter 150ms 行数可以超过65536 ...
- js接受url参数
1.正则表达式 function getQueryString(name) { var reg = new RegExp("(^|&)" + name + "=( ...
- 厦门BRT 硬币型非接触式IC卡分析
前几天去厦门玩顺便多买了一张BRT的票 也就是如图所示的这种硬币型非接触式IC卡 回来之后用Proxmark3分析了卡内数据得到如下16进制dump内容 UID.发卡日期时间. 最近好懒 懒得写了 有 ...
- POJ - 1245 Programmer, Rank Thyself
POJ - 1245 Programmer, Rank Thyself Time Limit: 1000MS Memory Limit: 10000KB 64bit IO Format: %I64d ...
- 解决连接VPN后无法上网问题
解决连接VPN后无法上网问题 VPN的英文全称是“Virtual Private Network”,翻译过来就是“虚拟专用网络”.顾名思义,虚拟专用网络可以把它理解成是虚拟出来的企业内部专线. 在公司 ...
- MVC异常日志生产者消费者模式记录(异常过滤器)
生产者消费者模式 定义自己的异常过滤器并注册 namespace Eco.Web.App.Models { public class MyExceptionAttribute : HandleErro ...
- Device Tree(三):代码分析【转】
转自:http://www.wowotech.net/linux_kenrel/dt-code-analysis.html Device Tree(三):代码分析 作者:linuxer 发布于:201 ...
- QT开发编译问题备忘
编译<Qt及Qt Quick开发实战精解> 的代码,编译出错,提示: Cannot find file: E:\学习资料\QT\<Qt及Qt Quick开发实战精解>代码\sr ...
- 【转】Struts1.x系列教程(6):Bean标签库
转载地址:http://www.blogjava.net/nokiaguy/archive/2009/01/archive/2009/01/archive/2009/01/archive/2009/0 ...