1.當你對數據庫多表操作出現錯誤的時候.用事務就可以回滾錯誤..比如你A表和B表是關聯表..你同時要更新A表和B表的信息.如果更新A表數據出現錯誤.如果用事務他將回滾.如果沒用事務他將直接更新B表.兩表之間就會出現關聯錯誤.
2.spring有自己的exception機制.
3.是業務層拋到dao層..業務層是在dao層之下的.
4.這兩者沒關係..
5.<prop  key="save*">表示所有save*的方法都會觸發事務,同理其他prop的key值都代表你的方法名.如果不回滾就不要把方法名取叫save或者save*(*是通配符)

解决方案 »

  1.   

    不理解spring事务管理的概念,类似上面的代码,弱弱的问一下。 1:请问,事务管理起什么作用? 
    2:spring是不是根据SqlException来工作? 
    3:是不是要把dao层的异常都抛到业务层才起作用? 
    4:如果业务层把异常都catch了,或者是抛掉了,那spring事务管理还起作用吗? 
    5:spring如何知道我怎样处理事务呢?怎么知道我要什么情况下回滚事务,什么情况下不回滚? 希望有人详细说说,谢谢了!上次也看了下
    1、类似与ejb中的容器管理事务,即在同一操作中,要么全部成立提交,要么有excetpion都不提交(回滚)
    2、好像是的吧,封装了JTA不敢确定,因为也没研究过spring代码
    3、这看应用了,总之是往外抛
    4、有啊,他是内部的,先是它在是你的程序
    5、上面的配置,不是由spring来管理事务了吗?
      

  2.   

    你都是處理業務的時候調用dao來對數據庫操作.不是從業務拋到dao么?
      

  3.   

    数据库学了没~~
    所谓的事务就是数据库的事务,框架不过是对数据库事物的封装,类似于JDBC对不同数据库的驱动进行封装一样;
    事务无非就是数据的一致性,以及隔离级别,传播属性等等几个老到不能再老的事务原则~~一致性无非就是上面说的即在同一操作中,要么全部成立提交,要么有excetpion都不提交(回滚);
    隔离级别是对数据存在缓存的时候,更新四度快慢的问题,更新快浪费内存,更新慢会有脏数据,这个设置仁者见仁,智者见智;
    传播属性,可以设置只读或又读又写,当然查询的时候设置成只读,那样效率可以提升一倍,一般设置传播,是提升效率的,和缓存一起用用得好的话可以超越JDBC的速度;他可以设置事务创建问题和操作问题;
             
    在给你解释解释代码!~~~~其实配置文件和写代码一样,有规律滴<bean  id="myTransactionManager"  
    //~你自己写的单词,myTransactionManage,这个Manage单词啥意思,不就是管理人吗~~这段的意思是所有事物的管理者!~
                        class="org.springframework.orm.hibernate.HibernateTransactionManager">   
                        //添加对应的类,这没啥好说的;
          <property  name="sessionFactory">  
          //注入你hibernate以及数据源的那些资料,sessionFactory看着名字,看也知道hibernate,其实spring设置名字挺人性化的;,要像正常人一样思维;
              <ref  local="mySessionFactory"/>   
          </property>   
    </bean>  
    <bean  id="postService"   
          class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">   
          <property  name="transactionManager">   
              <ref  local="myTransactionManager"/>   
          </property>   
          <property  name="target">   
              <ref  local="业务层的一个类"/>   
          </property>   
          <property  name="transactionAttributes">   
              <props>   
                  <prop  key="save*">   
                PROPAGATION_REQUIRED 
                  </prop>   
                  <prop  key="get*">   
                PROPAGATION_REQUIRED 
                  </prop>   
              </props>   
          </property>   
      </bean>    你的具体事务:<bean  id="postService"  
          上面的事务管理相当于黑社会老大,黑社会老大总要有小弟吧,这个就是他的小弟!~
          class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 
          //具体的类  
          <property  name="transactionManager">   
          //这个小弟总要知道,他是跟哪个老大混的吧,把它设置到事务管理里面去
              <ref  local="myTransactionManager"/>   
          </property>   
          <property  name="target">   
          //这单词啥意思~~target,目标的意思,目标是啥,就是目标类,就是那个作为原本作为代理的那个实例,AOP的动态代理,好好看看通知(Advice)是怎么配的,他也有target这个属性,和这个
            意思一样;
              <ref  local="业务层的一个类"/>   
          </property>   
          <property  name="transactionAttributes">  
          //设置传播属性的,我上面不是说了传播属性是啥了吗 
              <props>   
                  <prop  key="save*">   
                PROPAGATION_REQUIRED 
               //这个的意思,有事务就用,没有事务就创建一个;
                 默认是可读可写;如果readOnly就只是可读了
                  </prop>   
                  <prop  key="get*">   
                PROPAGATION_REQUIRED 
                  </prop>   
              </props>   
          </property>   
      </bean>    再有,别在spring的持久化层catch,它本身AOP就是为了让你不用写catch语句,所以在顶层封装好了,用模板过滤器HibernateTemplate,
    你自己catch语句,那还要框架干什么,框架的意义是节省程序员的代码,你反而弄多了;问,事务什么时候回滚,不回滚,自己去试验;
    把这段bean去掉;
    <bean  id="postService"
     ....   
    show_sql语句会显示数据递交到数据库了,但是数据库根本会有这条记录,这啥意思,就是没具体事务呗!然后再把这个bean也去掉,两个都去掉;
    <bean  id="myTransactionManager" 
    .....
    然后一切正常了.会使用默认事务,默认事务就是运行时异常回滚,检查异常不回滚~~~明白了没~~~可累死我了
      

  4.   

    所以在顶层封装好了,用模板过滤器HibernateTemplate, 打错字了弄出个个模板过滤器来~~~
    是模板HibernateTemplate,
    抱歉,别被我那错别字给误导了~~
      

  5.   

     事务是什么意思我知道,只是不知道spring的事务要怎么用才正常,才有效。   <property  name="target">    
              <ref  local="..."/>    
          </property>  是不是说指定的target类里不能自己补捉异常?
      

  6.   

    target是什么,你还是没明白,他是AOP的中的一个实现切面的元素;
    如果你的切面设置在DAO层上,那么可以理解为target类不用自己捕捉异常;
      

  7.   

    问下
                  <prop  key="save*">  
                PROPAGATION_REQUIRED 
                  </prop>  
    是说target类的以SAVE开头的方法都是一个事务吗?即回滚时一起回滚是吧?