ermao3545
the big fundmental
采纳率100%
2009-10-14 21:36

spring声明事务不回滚

已采纳

application的配置




com.test.service.UserService



PROPAGATION_REQUIRED


<bean id="userService"
    class="com.test.service.impl.UserServiceImpl">
    <property name="userDao" ref="userDao"></property>
</bean>

userServiceProxy代理userService

下面是userServiceImpl中的transaction方法。
public void transaction() throws Exception
{

    User user1 = new User();
    User user2 = this.userDao.findUserById(2);
    user1.setAge(111);
    user1.setFirstName("哈哈");
    user1.setLastName("哈哈哈");
    user2.setLastName("哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈");
    this.userDao.addUser(user1);
    this.userDao.updateUser(user2);
}

这个方法中,add()会成功。但是update()会出错。所以add()需要回滚。

再把DAO中的方法也贴出来。
public boolean addUser(User user) throws Exception
{
System.out.println(Integer.parseInt(this.getHibernateTemplate().save(user).toString()));
return true;
}

public boolean updateUser(User user) throws Exception
{
this.getHibernateTemplate().update(user);
return true;
}

我测试的结果是add()方法未回滚。但是我若用spring的编程式事务处理transaction方法则可以回滚。配置我都是照书上和网上这样写的啊。不知道为什么就是不回滚,感觉调试的时候根本没用到代理。直接add方法执行了数据库中就有数据了。求大家指点下吧,郁闷死我了。
[b]问题补充:[/b]
一楼的方法早试过,没用。按照二楼兄弟说的方法,把update()方法改掉
public boolean updateUser(User user)
{
throw new RuntimeException();
}
但是还是为回滚。所以我觉得根本未实现事务代理。因为我调试的时候语句刚跳过
this.userDao.addUser(user1); 数据库中就已经更新了。有哪位仁兄有一个spring声明式事务测试回滚成功的小例子,发给我看下。我QQ354571722.谢谢
[b]问题补充:[/b]
public User findUserById(int id)
{

    return (User) this.getHibernateTemplate().get(User.class, id);
}

不过这个方法应该没关系吧

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

4条回答

  • wanghaolovezlq wanghaolovezlq 12年前

    自己看看你配置的





    PROPAGATION_REQUIRED

    没有配置回滚策略嘛,所以使用默认的回滚策略

    默认的回滚策略:
    任何RuntimeException将触发事务回滚,但是任何checked Exception将不触发事务回滚

    你的配置修改为如下就行了:

            <props>   
                <prop key="transaction*">PROPAGATION_REQUIRED,-Exception</prop>   
            </props> 
    

    "-"表示发生指定异常后立即回滚

    点赞 评论 复制链接分享
  • wanghaolovezlq wanghaolovezlq 12年前

    这个方法粘出来
    this.userDao.[color=red]findUserById/color;

    点赞 评论 复制链接分享
  • wanghaolovezlq wanghaolovezlq 12年前

    看看和你相同问题的解决
    http://www.iteye.com/problems/26941

    点赞 评论 复制链接分享
  • lidying_1 lidying_1 12年前

    我个人认为是抛出异常的原因,在update方法中抛出的是已检查(checked)异常,而此类异常默认是不会进行回滚的,你可以在update方法抛出一个未检查异常,把原先的update语句去掉,也不要throws Exception,看add方法能否回滚

    点赞 评论 复制链接分享

相关推荐