VB5+SQL2000での ** TRANSACTIONについて(ADO)
環境:VB5(SP3)+SQL2000(SP1)
VBで、BEGIN TRANSACTIONを定義し、その後更新用DBを更新する前に、ストアドプロシージャを利用せずDBを検索した場合、問題無く更新用DBへの更新に対して(ROLLBACK/COMMIT) TRANSACTION が効くのですが、ストアドプロシージャで検索した場合、(ROLLBACK) TRANSACTION が効きません。
分かりづらいですがサンプルを記します。
Function Test()
Dim MyRs As New ADODB.Recordset
Dim MyRs2 As New ADODB.Recordset
:
MyDB.Execute "BEGIN TRANSACTION TEST999",,adCmdText+adExecuteNoRecords
:
'(A)不具合未発生パターン
'レコードセットを開く
'このように、レコードセットを作成した場合問題なし。
MyRs.Open "SELECT * FROM TESTDB..テスト",MyDB,adOpenStatic
'(B)不具合発生パターン
'ただし、上のSELECT文をストアドプロシージャで開いた場合、ROLLBACKが効かない
'レコードセットを開く(正常に(ROLLBACK)TRANSACTIONが動作せず、UpDate時にCommitしている)
'MyRs.Open "TESTDB..TEST001",MyDB,adOpenStatic
:
MyRs2.Open "SELECT * FROM TESTDB..更新テスト",MyDB,adOpenKeyset,adLockPessimistic
If Err <> 0 Then
'Error処理
End If
If MyRs2.EOF Then
MyRs2.AddNew
MyRs2![FLD1] = MyRs2![FLD1A]
Else
MyRs2![FLD1] = "TEST"
End If
MyRs2.UpDate 'ここは正常終了。(Err = 0)
'テスト用にエラー設定
Err = 1
if Err <> 0 then
'(B)不具合発生パターンの場合、ROLLBACK をしても、DBに登録されてしまう。
MyDB.Execute "ROLLBACK TRANSACTION TEST999",,adCmdText+adExecuteNoRecords
Exit Function
End If
MyRs.Close
MyRs2.Close
SmileDB.Execute "COMMIT TRANSACTION TEST999",,adCmdText+adExecuteNoRecords
End Function
お礼
ありがとうございます。 以下の文で流れを制御できました。 IF @@ERROR = 0 BEGIN COMMIT; print '正常終了:COMMITしました。'; END ELSE BEGIN ROLLBACK; print '異常終了:ROLLBACKしました。'; END