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个回答

自己看看你配置的





PROPAGATION_REQUIRED

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

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

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

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

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

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

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

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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐