-
spring,ibatis整合后的事务问题
SPRING事务不回滚的问题,我进行了两次插入数据库的操作,第二次故意给一个非空字段插入null,但第一条记录还是成功插入了,一个星期了,没搞定,求指教。其中数据库已经设置为autocommit为false
框架及版本:
struts2 -2.0.1.4 , spring -2.5 ,ibatis 2.3,mysql 5.0
aplicationContext.xml:
- <?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-2.5.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-2.5.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
- <bean id="dao" class="last.soul.dao.DAOImpl">
- <property name="sqlMapClient" ref="sqlMapClient"></property>
- </bean>
- <bean id="userService" class="last.soul.service.UserServiceImpl">
- <property name="dao" ref="dao"></property>
- </bean>
- <bean id="login" class="last.soul.action.LoginAction">
- <property name="userService" ref="userService"></property>
- </bean>
- <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
- destroy-method="close">
- <property name="driverClassName" value="com.mysql.jdbc.Driver" />
- <property name="url" value="jdbc:mysql://localhost:3306/test" />
- <property name="username" value="root" />
- <property name="password" value="root" />
- </bean>
- <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
- <property name="configLocation" value="WEB-INF/sqlMapConfig.xml" />
- <property name="dataSource" ref="dataSource" />
- </bean>
- <bean id="transactionManager"
- class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <property name="dataSource">
- <ref bean="dataSource" />
- </property>
- </bean>
- <!--
- 利用spring的TransactionProxyFactoryBean去对事务进行自动管理 <bean id="daoTr"
- class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
- <property name="transactionManager"> <ref local="transactionManager"
- /> </property> <property name="target"> <list><ref local="userService"
- /></list> </property> <property name="transactionAttributes"> <props>
- <prop key="*">PROPAGATION_REQUIRED,-Exception</prop> </props>
- </property> </bean>
- -->
- <tx:advice id="txAdvice" transaction-manager="transactionManager">
- <!-- 哪些方法有 事务的传播性-->
- <tx:attributes>
- <tx:method name="*" isolation="READ_COMMITTED" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
- </tx:attributes>
- </tx:advice>
- <!-- 哪些类的方法参与了事务 -->
- <aop:config>
- <!-- execution(* com.east.spring.managerimpl.*.*(..))这个类的所有方法都用事务 -->
- <aop:pointcut id="allManagerMethod"
- expression="execution(* last.soul.service.UserServiceImpl.*.*(..))" />
- <!-- 引用 pointcut 和 advice-->
- <aop:advisor pointcut-ref="allManagerMethod" advice-ref="txAdvice" />
- </aop:config>
- </beans>
UserServiceImpl:
package last.soul.service;
import last.soul.common.beans.User;
import last.soul.dao.DAO;
public class UserServiceImpl implements UserService {
DAO dao;
public boolean login(String username, String password) throws Exception {
User u1=new User();
u1.setEmail("d@163.com");
u1.setPassword("ccc");
u1.setUsername("aaaa");
dao.insert("user.insert", u1);
User u2=new User();
u2.setEmail("d@163.com");
u2.setPassword("he");
u2.setUsername(null);
dao.insert("user.insert", u2);
return true;
}
public DAO getDao() {
return dao;
}
public void setDao(DAO dao) {
this.dao = dao;
}
public boolean isExist(String username) {
return false;
}
public Integer register(User record) {
return null;
}
}
DAOImpl:
package last.soul.dao;
import java.sql.SQLException;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
public class DAOImpl extends SqlMapClientDaoSupport implements DAO{
@SuppressWarnings("unchecked")
public void insert(String sql,Object map) throws SQLException
{
this.getSqlMapClientTemplate().insert(sql, map);
}
}
问题补充:liwenjie 写道spring默认进行回滚的异常是uncheckedException,而lz的SQLException 是checkedexception,无法进行回滚所以需要进行声明
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="false" />
<tx:method name="*" rollback-for="SQLException"/>
</tx:attributes>
</tx:advice>
详情请参见 spring参考手册 回滚
我配的Exception不也一样而且我就是配置上了SQLException也是不回滚。
后来我又用了另外一个方法就是让他抛出我自己的异常,我让我自己的这个异常继承RuntimeException也是不回滚啊
spring,ibatis整合后的事务问题
最新推荐文章于 2024-09-19 21:52:00 发布