日期:2014-05-18  浏览次数:20715 次

@Transactional注解事物的问题,加急求解


//[一个类中的两个方法]

@Transactional
public void insertData(List<User> users,List<JdbcTemplate> jdbtTemplateList) {
   for(int i=0;i<users.size();i++)
   {
      insertData(users.get(i), jdbtTemplateList);
    }
}

public void insertData(User user,List<JdbcTemplate> jdbtTemplateList){
        for(int i=0;i<jdbtTemplateList.size();i++){
userDao.insertUser(user, jdbtTemplateList.get(i));
}
}



Spring框架,用的是跨数据源的事物管理器,jdbtTemplateList列表中的JdbcTemplate对应不同的数据源,在方法一注解@Transactional可以实现事物的回滚,有一条记录插入一个库失败,所有库都会回滚,但这样会导致所有的User对象都不能成功的插入,只要有异常产生。

本人想一个User记录插入失败,只是回滚此记录,就把方法一的@Transactional注解去掉,在方法二上加上注解@Transactional,这样结果事物没有产生作用。User对象插入一个库成功,另一个库失败,没有实现回滚。
在方法二上加上注解的话,

{

------解决方案--------------------
是这样的。
你这是service层,在service层加入注解使其回滚的话就是此次从操作的所有记录。
如果你在dao层加入注解的话回滚的就是失败的那一条了
至于你具体问啥,不是很清楚。
引用一下追问吧、
------解决方案--------------------
在这个类上加上注解就行了。
------解决方案--------------------
这种情况,你就应该借助AOP了。完全能解决你的问题。
------解决方案--------------------
没什么区别?
------解决方案--------------------
跨数据源事务管理需要使用jta事务:JtaTransactionManager
分析:第一种方式添加注解事务,只要一条插入失败,所有的记录都会回滚。因为在同一个方法中,循环插入只要一条失败,所有记录均会回滚,包含两个库的记录,符合理论。第二种情形方法一去掉注解事务,而在方法二上添加注解事务。结果一个库成功插入,而另外一个库操作失败,却没回滚。和刚才分析的就矛盾了。
提供思路:仔细验证跨数据源事务到底有没有正在生效?review方法,防止事务传播行为在作怪