honzeland

          記錄點滴。。。

          常用鏈接

          統計

          Famous Websites

          Java

          Linux

          P2P

          最新評論

          org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only

          發生這種異常的case:
              @Transactional
              
          public void foo() {
                  
          try{
                      bar();
                  } 
          catch (RuntimeException re) {
                      
          // caught but not throw further
                      
                  }
                  
              }

              @Transactional
              
          public void bar() {
                  
              }
          如果foo在調用bar的時候,bar拋出RuntimeException,Spring在bar return時將Transactional標記為Rollback only, 而foo捕獲了bar的RuntimeException,所以Spring將會commit foo的事務,但是foo和bar使用的是同一事務,因此在commit foo事務時,將會拋出UnexpectedRollbackException。注意:如果foo和bar在同一class中,不會出現這種情況,因為:

          Since this mechanism is based on proxies, only 'external' method calls coming in through the proxy will be intercepted. This means that 'self-invocation', i.e. a method within the target object calling some other method of the target object, won't lead to an actual transaction at runtime even if the invoked method is marked with @Transactional!

          可以通過配置log4j來debug Spring事務獲取情況:
          To delve more into it I would turn up your log4j logging to debug and also look at what ExerciseModuleController is doing at line 91, e.g.: add a logger for org.springframework.transaction

          posted on 2010-02-24 18:02 honzeland 閱讀(6991) 評論(0)  編輯  收藏 所屬分類: SpringHibernate

          主站蜘蛛池模板: 阳江市| 连城县| 乌拉特前旗| 垣曲县| 朝阳市| 吕梁市| 柳州市| 保定市| 上蔡县| 呼玛县| 探索| 高唐县| 榕江县| 嘉祥县| 敦煌市| 乐平市| 新巴尔虎左旗| 江达县| 汝城县| 安丘市| 建宁县| 磐石市| 抚宁县| 大港区| 黎城县| 武山县| 清远市| 宁城县| 内丘县| 岑溪市| 延庆县| 黑水县| 前郭尔| 辉县市| 弋阳县| 韶山市| 昌黎县| 湛江市| 托克逊县| 修水县| 垦利县|