none
transaction処理? RRS feed

  • 質問

  • お世話になります。vb2008,sql2005環境です。

    フォームのボタンの処理にて

     

    rental_masterテーブル開いて全レコードの最大の番号を入手する。

    最大番号+1の値を入れたバーコードを作成し新しいレコードとしてrental_masterに書き込む。

     

    という処理をさせてます。

    単体での処理は問題ないのですが、複数の端末からこの処理をさせる場合、同時に処理したら最大値を同時に取ってきて

    おかしくなるかと思っています。

    これまで使ったことが無いのですがtransaction処理にてこの処理を全部囲めば解決してくれるのかと思いtransaction回路を入れようと思いました。

    本に載っている例文は

    command.transaction=connection.begintransaction()

    ですが

    rental_masterテーブル開いて前レコードの最大の番号を入手する。部分ではusing connection as---- を使っていますので入れようと思ったら入りますが、

    最大番号+1の値を入れたバーコードを作成し新しいレコードとしてrental_masterに書き込む。の部分では

    Dim newrecord As butsuryuDataSet.rental_masterRow = Me.ButsuryuDataSet.rental_master.Newrental_masterRow()

            Try
                barcode_maker()
                newrecord.serial_num = Txtbarcode.Text
                newrecord.rental_tools_id = Txtrtid.Text
                newrecord.brand_name = Txtshohin.Text
                newrecord.trader_name = Txtshamei.Text
                Me.ButsuryuDataSet.rental_master.Addrental_masterRow(newrecord)
                Me.Rental_masterTableAdapter1.Update(Me.ButsuryuDataSet.rental_master)
            Catch ex As Exception
                MsgBox(ex.Message, MsgBoxStyle.OkOnly, Me.Text)
                Return
            End Try
            MsgBox("登録完了")

     

    であり、transactionを設置する方法が分かりません。

    2008年9月16日 4:37

回答

  • TransactionScope クラスはTableAdapterでも便利に使えますよ。
    http://msdn.microsoft.com/ja-jp/library/system.transactions.transactionscope(VS.80).aspx
    2008年9月17日 4:40
  • こんにちは、フォーラムオペレータ大久保です。

    えむナウさん、アドバイスありがとうございます!

     

    自動で番号を採番(しかも連番)したいということですよね?

    番号を取る部分と、とった番号を書き込む部分は別のアクションで実行されるんでしょうか?

    (同じタイミングであればコーディングに迷わないと思いますので、別のアクションなんだと思いますが)

     

    新しい番号を取ったらすぐにその番号を書き込んでしまわないと、「同時に処理したら」の「同時」が発生する可能性が高くなるだけですので、別の問題が出ると思います。

    (同時が発生した場合、後から番号を取ろうとしたプログラムが待たされる or エラーになる)

    transaction を使うという発想は正しい方向だと思うので、番号を取るタイミングとテーブルに書き戻すタイミングを検討された方がいいように思います。

     

    また、こんな解決方法もありますよ。

     

    http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=3897633&SiteID=7

     

    (どっとねっとふぁん さんの 22 9 2008, 10:57 午前  の投稿が参考になるかと)

     

     

    最後になりましたが、アドバイスをくださった えむナウ さんの投稿に「回答済み」チェックをつけさせていただきました。

    これでスレッドが終了というわけではありませんので、不明点などあれば返信ください。

     

    それでは

    2008年9月29日 9:11

すべての返信

  • TransactionScope クラスはTableAdapterでも便利に使えますよ。
    http://msdn.microsoft.com/ja-jp/library/system.transactions.transactionscope(VS.80).aspx
    2008年9月17日 4:40
  • こんにちは、フォーラムオペレータ大久保です。

    えむナウさん、アドバイスありがとうございます!

     

    自動で番号を採番(しかも連番)したいということですよね?

    番号を取る部分と、とった番号を書き込む部分は別のアクションで実行されるんでしょうか?

    (同じタイミングであればコーディングに迷わないと思いますので、別のアクションなんだと思いますが)

     

    新しい番号を取ったらすぐにその番号を書き込んでしまわないと、「同時に処理したら」の「同時」が発生する可能性が高くなるだけですので、別の問題が出ると思います。

    (同時が発生した場合、後から番号を取ろうとしたプログラムが待たされる or エラーになる)

    transaction を使うという発想は正しい方向だと思うので、番号を取るタイミングとテーブルに書き戻すタイミングを検討された方がいいように思います。

     

    また、こんな解決方法もありますよ。

     

    http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=3897633&SiteID=7

     

    (どっとねっとふぁん さんの 22 9 2008, 10:57 午前  の投稿が参考になるかと)

     

     

    最後になりましたが、アドバイスをくださった えむナウ さんの投稿に「回答済み」チェックをつけさせていただきました。

    これでスレッドが終了というわけではありませんので、不明点などあれば返信ください。

     

    それでは

    2008年9月29日 9:11