none
想請問關於 TransactionScope 與 SQL Connection的問題 RRS feed

  • 問題

  • 想請問個問題
    我有一段程式
    我要對每一筆資料用不用的Transaction去做處理

    Using _sqlConnection As New SqlConnection()
    For Each _record in _records
    Using _trans As New TransactionScope
    Try
    '資料庫處理程序1

    '資料庫處理程序2

    _trans.Complete()
    Catch ex As Exception
    '錯誤處理
    End Try
    End Using
    Next
    End Using

    目前的問題是我想要在處理程序2失敗丟出exception的時候,程序1要roll back
    旦上述的寫法雖然程序2丟出了exception,但程序1依舊是commit的
    我改寫成下列的方法後,就可以了

    For Each _record in _records
    Using _trans As New TransactionScope
    Using _sqlConnection As New SqlConnection()
    Try
    '資料庫處理程序1

    '資料庫處理程序2

    _trans.Complete()
    Catch ex As Exception
    '錯誤處理
    End Try
    End Using
    End Using
    Next

    看起來似乎是TransactionScope與SqlConnection順序的問題
    希望知道原因的各位能幫我解除這個疑惑
    謝謝!

     

    Compiler: VS2008

    2010年5月13日 上午 02:48

解答

  • TransactionScope的用法就是出現在TransactionScope控制範圍中的資料庫操作, 才會是Transaction管轄的範圍, 因為第二種寫法才是正確的.

    另外, 程式可以不需要為每一個Record做Transaction處理, 直接把:

    For Each _record in _records

    Next

    放入到TransactionScope控制範圍中即可

    • 已標示為解答 Ken Chang 2010年5月13日 下午 02:23
    2010年5月13日 上午 07:42

所有回覆

  • TransactionScope的用法就是出現在TransactionScope控制範圍中的資料庫操作, 才會是Transaction管轄的範圍, 因為第二種寫法才是正確的.

    另外, 程式可以不需要為每一個Record做Transaction處理, 直接把:

    For Each _record in _records

    Next

    放入到TransactionScope控制範圍中即可

    • 已標示為解答 Ken Chang 2010年5月13日 下午 02:23
    2010年5月13日 上午 07:42
  • 謝謝你的解答

    不過會每一筆record用一個transaction是因為特殊需求啦
    哈~ :D

    2010年5月13日 下午 02:24