歲月如哥
          人生非夢
          posts - 50,comments - 144,trackbacks - 0
          原來調用存儲過程的地方都沒有使用事務,當然里面包括多個表的更新操作,使用都很正常。后來我給加上了jdbc事務,代碼如下:
          引用:
          TransactionStatus status = super.beginTransaction();
                          try {
                                  map = getFtglUtils().cancelFtrw(getPageAjlb(),
                                                  key.getId1().intValue(), key.getId2().intValue(), qxyy,
                                                  iState);
                                  super.getTransactionManager().commit(status);
                          } catch (Exception e) {
                                  super.getTransactionManager().rollback(status);
                                  throw new SystemException(e);
                          }
          加上事務之后就發現存儲過程沒有完全執行,里面的update語句都沒有執行,但是最后的select還能返回結果集,調用后臺也不報錯……百思不得其解。后來湊巧把存儲過程中創建臨時表的如下語句
          引用:
          -- 創建臨時表
                    create table #tmpBAGL
                    (
                        BH int,                    -- 編號
                        RWXH smallint              -- 任務序號
                    )  
          移到了使用這個臨時表的if else里面,因為只有在一定的條件下才需要創建臨時表。再試了一下調用存儲過程,發現一切正常了!這一次存儲過程沒有執行創建臨時表,就正常了……遂上網搜到一個如下的描述:
          引用:
          select into可以在事務中使用,但是前提條件是這個事務只有select into一條語句。
          SELECT INTO command not allowed within multi-statement transaction.  
          注意是multi-statement transaction
          大家都知道,select into #tabel的最大優勢是速度快,但這個速度快是用不記錄日志來實現的。
          而使用事務的目的就是要么事務中的所有操作全部執行,要么所有操作全部回滾。
          這是靠日志中記錄的操作來保證的。
          如果select into可以在多語句的事務中使用,但是它本身又是不計日志的,也就是不能回滾的。
          這就和事務的定義矛盾了。
          因此,select into不能在多語句的事務中使用。
          但也不是說我們不能使用select into這個好東東,set chained off,使用非鏈式事務或者把select into
          放在單獨一個事務中運行就可以了。
          還有一個在多語句事務中被禁止的,而在應用中會常需要的命令是truncate table。
          原因和解決方法也如上所說。
          把存儲過程還原成最開始那樣,在創建臨時表之前加上set chained off,再次運行問題解決。
          posted on 2009-01-12 09:35 歲月如歌 閱讀(2783) 評論(1)  編輯  收藏

          FeedBack:
          # re: sybase事務中調用含有臨時表的存儲過程的問題
          2010-09-17 09:16 | strawbingo
          不錯,謝了。
          但是可以更詳細一些  回復  更多評論
            

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 松桃| 新安县| 蓬莱市| 岳阳市| 响水县| 湾仔区| 绵阳市| 民勤县| 扎囊县| 和平县| 临江市| 苏尼特右旗| 克东县| 互助| 松溪县| 裕民县| 都匀市| 盐城市| 湘阴县| 闸北区| 文山县| 保德县| 会宁县| 东山县| 太仆寺旗| 新昌县| 炎陵县| 海口市| 会宁县| 丰原市| 无极县| 斗六市| 琼中| 松桃| 麻江县| 永胜县| 邵东县| 克山县| 昭觉县| 隆昌县| 凤城市|