歲月如哥
          人生非夢
          posts - 50,comments - 144,trackbacks - 0
          <2009年1月>
          28293031123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(11)

          隨筆分類(45)

          相冊

          收藏夾(21)

          friends

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          原來調用存儲過程的地方都沒有使用事務,當然里面包括多個表的更新操作,使用都很正常。后來我給加上了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 歲月如歌 閱讀(2785) 評論(1)  編輯  收藏

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

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


          網站導航:
           
          主站蜘蛛池模板: 横山县| 历史| 天津市| 康定县| 香格里拉县| 北宁市| 游戏| 新蔡县| 东光县| 资阳市| 三门县| 长海县| 新宁县| 津南区| 灵石县| 蓬莱市| 松潘县| 临潭县| 扎赉特旗| 胶南市| 龙山县| 仲巴县| 罗平县| 南溪县| 开平市| 屏南县| 东光县| 班玛县| 涪陵区| 泰州市| 子洲县| 常德市| 凌源市| 新竹市| 南木林县| 新沂市| 子长县| 丰镇市| 柘荣县| 米林县| 上犹县|