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 ...
随机推荐
- 什么是Servlet?它有哪些特点
什么是Servlet? 它有哪些特点? Servlet是运行在JSP服务器端,用来生成Web页面的一种java程序 特点: (1)效率点 (2)功能强大 (3) Servlet之间能够共享数据 (4 ...
- VS2010 支持 CSS3
在安装Standards Update for VS2010 SP1后,VS2010中没有CSS3.0问题,以下是我的解决方法 1.首先去官网下载 CSS 3 Intellisense Schema ...
- [转]ASP.NET MVC Json()处理大数据异常解决方法 json maxjsonlength
本文转自:http://blog.csdn.net/blacksource/article/details/18797055 先对项目做个简单介绍: 整个项目采用微软的ASP.NET MVC3进行开发 ...
- Signalr简单例子
一.需要引用的 Js: 二.编码 用的是signalr2,需要新建Startup.cs类,编码如下: using Microsoft.Owin; using Owin; using System; u ...
- iOS9适配 之 关于info.plist 第三方登录 添加URL Schemes白名单
近期苹果公司iOS 9系统策略更新,限制了http协议的访问,此外应用需要在“Info.plist”中将要使用的URL Schemes列为白名单,才可正常检查其他应用是否安装. 受此影响,当你的应用在 ...
- asp.net 分页-自己写分页控件
去年就发表过asp.net 分页-利用后台直接生成html分页 ,那种方法只是单纯的实现了分页,基本不能使用,那时就想写个自己的分页控件,无奈能力有限.最近有点时间了,就自己做出了这个分页控件.我承认 ...
- if 语句运用
运用if语句完成对年.月.日的判断. Console.WriteLine("其输入年份:"); int a = int.Parse(Console.ReadLine()); Con ...
- Unity-The Courtyard demo学习
1.编辑器相机同步 The Courtyard的demo中,会发现Scene视图和Game视图是编辑器下同步的,它通过一个CopySceneView.cs脚本实现 Scene视图和Game视图的显示效 ...
- MVC中Razor的使用 及路径问题
语法: @ 可以编写一条C#语句@{} 可以编写一组C#语句@: 将文字内容直接输出到页面上去@() 在一句中将一段C#代码包括起来,证明这一句完整的C#代码 引用命名空间:@using 空间名称 H ...
- [问题2014A07] 解答
[问题2014A07] 解答 我们分三步进行证明. \(1^\circ\) 先证 \(\alpha_1,\alpha_2\) 线性无关. 用反证法, 设 \(\alpha_1,\alpha_2\) ...