我要执行两次添加操作 两次添加同样的数据 报唯一约束的错 然后让他回滚 返回 根据条件返回值
这是我想要的效果
现在是 发现有异常就回滚 可是由于有异常
方法中的
if(res1==res2&&res1==1)
return 0;
else return -1;
就不执行了
现在想让事物可以正常使用,也能根据执行sql的结果进行判断。
对于异常该怎么处理。
--------------------------------------------------------------------------------userdao
package com.haitu.dao.impl;
import java.sql.SQLException;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import com.haitu.model.UserInf;
public class UserDao implements com.haitu.dao.UserDaoInf{
private SqlSession sqlSession ;
public UserDao(SqlSession sqlSession) {
// TODO Auto-generated constructor stub
this.sqlSession=sqlSession;
}
public int addUser(UserInf userInf) {
int res1= sqlSession.update("UserInf.addUser",userInf);
int res2= sqlSession.update("UserInf.addUser",userInf);
//??????此处执行事物问题 执行两次添加操作 两次添加同样的数据 报唯一约束的错 然后让他回滚
//由于出现异常下面的判断代码执行不了
if(res1==res2&&res1==1)
return 0;
else return -1;
}
public List<UserInf> selectUser() {
return sqlSession.selectList("UserInf.selectUser");
}
}
------------------------------------------------------------------spring配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations" value="WEB-INF/jdbc.properties"></property>
</bean>
<!-- 配置数据库 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${driverClass}"> </property>
<property name="jdbcUrl" value="${jdbcUrl}"> </property>
<property name="user" value="${user}"> </property>
<property name="password" value="${password}"> </property>
<property name="maxPoolSize" value="${maxPoolSize}"> </property>
<property name="minPoolSize" value="${minPoolSize}"> </property>
<property name="maxIdleTime" value="${maxIdleTime}"> </property>
<property name="idleConnectionTestPeriod" value="${idleConnectionTestPeriod}"> </property>
</bean>
<!-- 加载 abities
SqlSessionFactoryBean 这里是与ibatis以前版本区别的地方
这里不是继承 sprig的FactoryBean 因为spring的版本没有更新 由ibatis jar包自己开发类继承了
spring的FactoryBean类
另外 必备属性:dataSource
-->
<bean id="sqlMapClient"
class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource">
<ref local="dataSource" />
</property>
<property name="configLocation" value="classpath:ibatis.xml"></property>
</bean>
<!-- 把加载了 配置文件的 sqlMapClient 注入 SqlSessionTemplate模板-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlMapClient" />
</bean>
<!-- 通过spring 把已经加载ibatis配置文件sqlMapClient bean 注入到 dao类 供
dao类查询数据 -->
<bean id="UserDao" class="com.haitu.dao.impl.UserDao">
<!-- 使用构造器注入 -->
<constructor-arg ref="sqlSession" />
</bean>
<!-- pojo -->
<bean id="UserAction" class="com.haitu.action.UserAction" scope="prototype" >
<property name="userDao" ref="UserDao"></property>
</bean>
<!-- 事务的定义 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref local="dataSource" />
</property>
</bean>
<aop:config>
<aop:pointcut id="daoMethods" expression="execution(public * com.haitu.dao.UserDaoInf.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="daoMethods"/>
</aop:config>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" rollback-for="Exception" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
</beans>
--------------------------------------------------------------------------------struts2配置:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<constant name="struts.devMode" value="true" />
<constant name="struts.locale" value="zh_CN" />
<constant name="struts.i18n.encoding" value="UTF-8" />
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index" />
<action name="index">
<result type="redirectAction">
<param name="actionName">HelloWorld</param>
<param name="namespace">/example</param>
</result>
</action>
<!-- 将json串作为text返回-->
<action name="userinf_*" class="UserAction" method="{1}">
<result type="stream" name="plain">
<param name="contentType">text/html</param>
<param name="inputName">inputStream</param>
</result>
</action>
</package>
</struts>
--------------------------------------------------------------------------------ibatis配置:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
<configuration>
<!-- 对应一些POJO类 然后可以在mapper中引用Emp 等就等于引用这个类类型-->
<typeAliases>
<typeAlias type="com.haitu.model.UserInf" alias="UserInf" />
</typeAliases>
<!-- 加载相关ibatis的映射文件 -->
<mappers>
<mapper resource="com/haitu/model/UserInf.xml" />
</mappers>
</configuration>
--------------------------------------------------------------------------------useraction 中的方法
public String addUserInf() {
try {
inputStream = new StringBufferInputStream(new String("{success: true, msg:\"添加成功\"}".getBytes("utf-8"),"iso-8859-1"));
} catch (Exception e) {
// TODO: handle exception
}
int res=userDao.addUser(userinf);
System.out.println("----------------"+res);
return "plain";
}
6 个解决方案
#1
事件回滚,是不是就把你的操作终止了..
所以你以后的事件全部不执行了!!
所以你以后的事件全部不执行了!!
#2
修改下
是报错代码后面的代码全部不执行了!
#3
是的 就是这样
#4
有没有试过先捕捉异常,处理完成之后,再将异常抛出给事务,进行回滚处理呢??
#5
这样应该可以 可是总是这样做 我觉得太差了 是不是我配置的不对 或者怎么弄 正常来说不是这样做的吧
#6
知道怎么处理了
public int addUser(UserInf userInf) {
try{
int res1= sqlSession.update("UserInf.addUser",userInf);
int res2= sqlSession.update("UserInf.addUser",userInf);
}cathch(RuntimeException e )
{
throw e;
}
}
然后在action中 try catch
public int addUser(UserInf userInf) {
try{
int res1= sqlSession.update("UserInf.addUser",userInf);
int res2= sqlSession.update("UserInf.addUser",userInf);
}cathch(RuntimeException e )
{
throw e;
}
}
然后在action中 try catch
#1
事件回滚,是不是就把你的操作终止了..
所以你以后的事件全部不执行了!!
所以你以后的事件全部不执行了!!
#2
修改下
是报错代码后面的代码全部不执行了!
#3
是的 就是这样
#4
有没有试过先捕捉异常,处理完成之后,再将异常抛出给事务,进行回滚处理呢??
#5
这样应该可以 可是总是这样做 我觉得太差了 是不是我配置的不对 或者怎么弄 正常来说不是这样做的吧
#6
知道怎么处理了
public int addUser(UserInf userInf) {
try{
int res1= sqlSession.update("UserInf.addUser",userInf);
int res2= sqlSession.update("UserInf.addUser",userInf);
}cathch(RuntimeException e )
{
throw e;
}
}
然后在action中 try catch
public int addUser(UserInf userInf) {
try{
int res1= sqlSession.update("UserInf.addUser",userInf);
int res2= sqlSession.update("UserInf.addUser",userInf);
}cathch(RuntimeException e )
{
throw e;
}
}
然后在action中 try catch