none
TablerAdapterでトランザクション制御すると例外がスローされる。 RRS feed

  • 質問

  • TablerAdapterでトランザクション制御をしたく以下のようなソースコードを書きました。

           
            'トランザクション制御
            Using txScope As New TransactionScope(TransactionScopeOption.RequiresNew)

                '申請A
                Dim daShinsei As New dsAbcTableAdapters.tran_A_tableTableAdapter
                daShinsei.InsertA("A","A")

                '申請B
                Dim daShouhin As New dsAbcTableAdapters.tran_B_tableTableAdapter
                daShouhin.InsertB("B","B")
               
                txScope.Complete()

            End Using

    daShinsei.InsertA("A","A")はtran_A_tableにレコードを挿入し、daShouhin.InsertB("B","B")はtran_B_tableにレコードを挿入します。

    そうしたところ、以下のような例外が出ました。

    System.Transactions.TransactionException はユーザー コードによってハンドルされませんでした。
      Message="トランザクションはすでに、暗黙的または明示的にコミットされているかまたは中止されています。"
      Source="System.Transactions"
           
    TableAdapterでtran_A_tableとtran_B_tableにレコードを挿入したいです。片方のInsertが失敗したらもう片方のInsertも失敗するというようにしたいです。
    どなたか方法をご教授願います。よろしくお願いします。

    2007年10月31日 7:26

回答

  • TransactionScopeOption.RequiresNewというのが気になりますが、他にトランザクションがあるのでしょうか?

    2回Insertメソッドを実行していますので、分散トランザクションにプロモートされていると思いますが、この辺りが影響しているのかもしれません。(あてずっぽです)

    とりあえずどちらか一方のテーブルのみにInsertするように変えるとどうなりますでしょうか?

    また、Complete()を実行しても必ず成功するとは限りませんので、try~catchで囲むようにして下さい。

    2007年11月1日 5:54
    モデレータ

すべての返信

  • InsertAとInsertBの中身を提示できますか?

     

    2007年10月31日 10:14
  • TransactionScopeOption.RequiresNewというのが気になりますが、他にトランザクションがあるのでしょうか?

    2回Insertメソッドを実行していますので、分散トランザクションにプロモートされていると思いますが、この辺りが影響しているのかもしれません。(あてずっぽです)

    とりあえずどちらか一方のテーブルのみにInsertするように変えるとどうなりますでしょうか?

    また、Complete()を実行しても必ず成功するとは限りませんので、try~catchで囲むようにして下さい。

    2007年11月1日 5:54
    モデレータ
  • ご返信ありがとうございます。

     

    申し訳ありません。できないんです。

     

    2007年11月14日 1:31
  • ご返信ありがとうございます。

     

    TransactionScopeOption.RequiresNewというのが気になりますが、他にトランザクションがあるのでしょうか?

    →特にトランザクションはありませんが、参考にした本のまねをしたこと、新しいトランザクションを明示的に指定したほうがいいかと考えたことが原因です。

     

    2回Insertメソッドを実行していますので、分散トランザクションにプロモートされていると思いますが、この辺りが影響しているのかもしれません。(あてずっぽです)

    とりあえずどちらか一方のテーブルのみにInsertするように変えるとどうなりますでしょうか?

    →そうかもしれません。というのも、ConnectionStringのEnlist=falseにしたら例外をはかなくなりました。

     

    また、Complete()を実行しても必ず成功するとは限りませんので、try~catchで囲むようにして下さい。

    →そうします。Catchして成否をユーザに表示します。

     

     

    2007年11月14日 1:36