the big fundmental 2009-10-14 21:36 采纳率: 100%
浏览 318
已采纳

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 2009-10-14 21:40
    关注

    自己看看你配置的





    PROPAGATION_REQUIRED

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

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

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

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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办