Spring2.5业务层注解事务不能回滚...

xiaokang520 2010-01-12 10:58:48
如上,代码下列:
DAO层
public class MySQLCommonDBServiceImpl implements CommonDBService {
private JdbcTemplate jt ;
.....
/**
* 根据主键ID更新
*/
public <T> int updateDataById(T vo) throws Exception{
final Class<?> type = vo.getClass();
String fieldName = "";
ArrayList<String> fieldList = new ArrayList<String>();
ArrayList<String> fieldNames = new ArrayList<String>();
for(Field field : type.getDeclaredFields()){
fieldName = field.getName();
if (null!=getBeanFieldValues(vo,fieldName) && !fieldName.endsWith("_")){
fieldList.add(fieldName.concat("=?"));
fieldNames.add(fieldName);
}
}
String sql = String.format("UPDATE %s SET %s WHERE id=?",
type.getSimpleName().toLowerCase(),
fieldList.toString().replace('[', ' ').replace(']', ' ') );
Object[] params = new Object[fieldNames.size()+1];
for(int m=0;m<fieldNames.size();m++){
params[m] = getBeanFieldValues(vo, fieldNames.get(m));
}
params[params.length-1] = getBeanFieldValues(vo, "id");

return jt.update(sql, params);
}
}

业务层:
public class MainBean {

private CommonDBService commonDbService;

//使用注解支持业务层事务
@Transactional(rollbackFor=Exception.class)
public void TestTrans() throws Exception{
Person vo=null;
Products pvo = null;
vo = commonDbService.queryDataById(Person.class, null, null, "101",null);
vo.setName("zzz");
pvo = commonDbService.queryDataById(Products.class, null, null, 1, null);
pvo.setProductname("jackjackjackjackjackjackjackjackjackjackjackjackjackjackjackjackjackjack");//引发异常
commonDbService.updateDataById(vo);//居然提交了,没有回滚
commonDbService.updateDataById(pvo);
}
}

测试客户端
public class TestSpringJdbc {

/**
* @param args
*/
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{ "Springconfig.xml" });
MainBean mainbean = (MainBean)ctx.getBean("mainbean");
try {
mainbean.TestTrans();
} catch (Exception e) {
e.printStackTrace();
}
}

Spring配置
<context:annotation-config />
<!-- 让Spring通过自动扫描来查询和管理Bean -->
<context:component-scan base-package="net.duoer" />

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/testdb?characterEncoding=GBK" />
<property name="username" value="root" />
<property name="password" value="123456" />
<property name="initialSize" value="1" />
<property name="maxActive" value="50" />
<property name="minIdle" value="1" />
<property name="defaultAutoCommit" value="false"/>
</bean>

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<constructor-arg><ref bean="dataSource"/></constructor-arg>
</bean>

<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref local="dataSource"/>
</property>
</bean>

<tx:annotation-driven transaction-manager="txManager" />

<bean id="mainbean" class="net.duoer.MainBean" autowire="byName" />

<bean id="commonDbService" class="net.duoer.service.impl.MySQLCommonDBServiceImpl">
<property name="jt" ref="jdbcTemplate" />
<property name="isDebug" value="true"></property>
</bean>

===============================================
问题:我指定只要有的异常Exception就执行回滚事务,如下
@Transactional(rollbackFor=Exception.class)
public void TestTrans() throws Exception
但是
commonDbService.updateDataById(vo);//居然提交了,没有回滚
commonDbService.updateDataById(pvo);
第一个VO总是提交,没有回滚...

请高手帮看看,谢谢..
...全文
416 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
袭烽 2010-05-09
  • 打赏
  • 举报
回复
mysql数据库表有区分支持事务和不支持事务的,MyISAM是不支持事务的,InnoDB才支持事务,请先检查你的数据库表是否支持事务。
injuer 2010-05-09
  • 打赏
  • 举报
回复
使用JPA必须配合AOP才能回滚,这是spring帮助文档上的建议,因为JPA在2.5和3.0中还为成熟....
fdgaq 2010-05-08
  • 打赏
  • 举报
回复
我也碰到同样的问题,盼望高手解决啊
yaku2688 2010-01-14
  • 打赏
  • 举报
回复
你先Debug一下,确定执行到了,还是配置出问题。
xiaokang520 2010-01-12
  • 打赏
  • 举报
回复
自己顶,难道还要配置AOP?

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧