刚刚学习Spring的时候、就只知道Spring有事务管理这么一说、然而到现在也只是学到一点点基础的东西!
    与其说是分享倒不如说是提问了呵呵!
    前提:在定义好Spring的事务管理配置、跟aop切面过后。
    一般切面都定义在Service层、
    然后里面以什么什么开头的方法*这样!
    <tx:method name="insert*" propagation="REQUIRED" />
    那么Spring在你这个方法运行完了过后呢就会给你自动提交或者回滚、!
    那么在什么情况下正常提交、在什么情况下又会自动回滚呢!
    在方法正常运行完毕过后呢、Spring就会自动给你提交。
    在方法发生异常过后呢、Spring就会自动回滚你的事务!
    下面是一个案例:
    需求:循环添加一组数据到数据库、当其中一条数据添加出错、则所有数据都要回滚!
    那么首先在dao层的时候我们定义的方法要抛出异常、这样Service层才能够捕获得到!
    如(Dao):/**
 * 添加
 */
public int insert(Object obj) throws Exception {
String sql = "insert into bpip_unit(unitid)  values('"+obj+"')";
Query q = super.getSession().createSQLQuery(sql);
return q.executeUpdate();
}    那么在Service层就开始捕获:boolean bool = false;
try{
for (int i = 0; i < bp.length; i++) {
int num = baseDao.insert(bp[i]);
if (num > 0) {
bool = true;
}
}
}catch(Exception ex){
bool = false;
ex.printStackTrace();
}
return bool;    1、必须在Service层做循环操作因为Serivce的方法一执行完毕就会提交事务、事务已提交数据就入库了、这样就会出现原本应该一起入库的信息出现了"落单"的情况。
    2、在Dao层只需要(也必须)抛出异常、不需要捕获、如果你在Dao层捕获异常信息、那么方法还是回走下去。在Service这边就不知道你Dao层到底有没有出异常了!这个是我知道的Spring事务处理方面的东西、可能有很多个人观点在里面、也有可能自己闭门造车!
    在此希望各位能说说各位是怎么用Spring的事务处的!
    感激不尽!

解决方案 »

  1.   

    那就推荐一本书吧!!!
       关于Spring方面的!
      

  2.   

    基本应用的话,可以看spring in action  第二版    看了以后,可以看看《spring技术内幕》,这本书对源码分析的挺多
      

  3.   

    最近一个社友遇到了Spring事务不能回滚的问题!
    原帖地址:http://topic.csdn.net/u/20120816/11/0716a665-61ae-4092-9fce-69f162c90016.html这个是他的配置:    <tx:advice id="txAdvice" transaction-manager="txManager">
            <tx:attributes>
                <tx:method name="save*" propagation="REQUIRED" />
                <tx:method name="del*" propagation="REQUIRED" />
                <tx:method name="update*" propagation="REQUIRED" />
                <tx:method name="*" propagation="SUPPORTS" read-only="true" />
            </tx:attributes>
        </tx:advice>Service:public void saveUser(USM_USER User) {
            this.userDao.saveObject(User);
            //做2次插入,按道理第二次会失败,那应该要回滚第一次的插入吧
            this.userDao.saveObject(User);
        }dao:public Serializable saveObject(E entity) {
            Serializable id = null;
            try {
                id = getHibernateTemplate().save(entity);
            } catch (Exception e) {
                logger.error("保存实体对象异常,对象是" + entity, e);
                return null;
            }
            return id;
        }----------------------------------------------------------------------
    不能回滚的原因呢!
    主要是因为他在dao底层处理的异常、没有把它抛出!
    Service呢、捕获不到、所以就回滚不了事务了!做法呢有很多种:
    注意一点、在默认情况下spring只会在发生RuntimeException及其子类的异常时回滚。
    如果需要捕获其它异常呢、可以在配置中添加:<!--如果使用:org.springframework.transaction.interceptor.TransactionProxyFactoryBean-->
    <prop key="insert">PROPAGATION_REQUIRED,-Exception</prop> 
    <!--如果使用:org.springframework.orm.hibernate3.HibernateTransactionManager-->
    <tx:method name="save*" propagation="REQUIRED" rollback-for="Exception" />
    <!--或者使用-->
    <tx:method name="save*" propagation="REQUIRED" rollback-for="java.lang.Exception" />Exception跟java.lang.Exception都行!
    值得注意的是、在Service中他的代码就不能try{}catch{}。
    如果try{}catch{}的话、事务就不会回滚了!
    必须throws Exception!