DOBON.NET DOBON.NETプログラミング掲示板過去ログ

同一BeginTrans内でDelete、Insert処理

環境/言語:[Microsoft Visual Web Developer 2008 Express Edition ASP.NET (VB.NET) Framework3.5]
分類:[ASP.NET]


TRY処理の括りでBeginTrans()を実施し
DELETE処理を実施後、INSERT処理を実施した場合に
INSERT処理で重複エラーがでます。
ASP.NETの仕様でしょうか。

TRY括りで仮想化された同一空間内だと思うのですが、
コーディングミスによる影響でDELETE、INSERT処理がうまく実施されないのでしょうか。ご教示、アドバイス願います。

■ロジック
Imports System.Data.SqlClient
-----------------------------------
Public Function FunctionAAA
(ByVal 引数1 As String, ByVal 引数2As String, ByVal 引数3 As String)
As Boolean

Dim sqlManger As New SQLManager("接続文字列")
TRY
 処理A
Catch ex As Exception
 エラー処理
Return False

End Try

TRY
''TBL削除処理
Const DELETE_NG_DETAIL_SQL As String = "DELETE" & vbCrLf _
& " FROM ng_detail" & vbCrLf _
& " WHERE" & vbCrLf _
& " 項目A = @設定値" & vbCrLf

sqlManger.ClearParams() ''SQLパラメータ初期化
sqlManger.AddParam("@設定値", Data.SqlDbType.VarChar, 引数1) ''SQLパラメータ設定
affected = sqlManger.ExecuteNonQuery(DELETE_NG_DETAIL_SQL) ''SQL実行

sSql = "" & vbCrLf
sSql = sSql & " INSERT INTO ng_detail" & vbCrLf
sSql = sSql & " SELECT" & vbCrLf
sSql = sSql & " 項目A , 項目B ,項目C , getdate() , getdate() , " & vbCrLf
sSql = sSql & " '" & tantoTxt.Text & "'" & vbCrLf
sSql = sSql & " FROM" & vbCrLf
sSql = sSql & " TBL_ABC (nolock)" & vbCrLf
sSql = sSql & " WHERE" & vbCrLf
sSql = sSql & " 項目A = '" & 引数1 & "'" & vbCrLf
sSql = sSql & " AND 項目B <> 0 " & vbCrLf
sSql = sSql & " GROUP BY 項目A" & vbCrLf
sSql = sSql & "" & vbCrLf

affected = sqlManger.ExecuteNonQuery ''SQL実施

If sqlManger.HasError Then
 sqlManger.GetLastException().Message
Else
 Logger.Debug("NGD:" & affected & "件登録")
End If

Catch ex As Exception
sqlManger.RollbackTrans
sqlManger.ClearParams
Return False

End Try
sqlManger.CommitTrans
sqlManger.ClearParams
Return True

End Function

宜しくお願いいたします。
2011/04/19(Tue) 16:25:42 編集(投稿者)

  日本語でおkだったので修正...

■No28482に返信(はちまきさんの記事)
> TRY処理の括りでBeginTrans()を実施し
> DELETE処理を実施後、INSERT処理を実施した場合に
> INSERT処理で重複エラーがでます。
> ASP.NETの仕様でしょうか。

少なくとも ASP.NET テクノロジとは無関係なところだと思いますが...
かといって、.NET Framework (SqlClient) もしくは RDBMS の仕様というわけでもないと思います。

単純に、期待どおりのレコードが削除できていないか、あるいは INSERT で追加されるレコードのユニーク キーが期待どおりでないかのどちらかだと思います。
SQLManager はラッパークラスだと思いますが、この内部実装がまずくてトランザクション処理が無視されている可能性も勿論あります。

どの場合にしても同じ SQL コマンドを別の方法 (SQL Server Management Studio 等) で実行することで確認することができます。

 ・DELETE で期待通りのレコードが削除できているか
 ・INSERT の副問い合わせである SELECT 句のレコードが期待どおりか (重複がないか)
 ・同一トランザクションでないことを疑うのであれば、トランザクション処理なしで実行したらどうなるか

以上の検証を行えば原因はわかるかと思います。

> TRY括りで仮想化された同一空間内だと思うのですが、
> コーディングミスによる影響でDELETE、INSERT処理がうまく実施されないのでしょうか。ご教示、アドバイス願います。

仮想化? よくわかりませんでしたので、私は同一トランザクション処理上であると読み取らさせて頂きました。
誤りがあったら申し訳ないです。
■No28483に返信(じゃんぬねっとさんの記事)
> 2011/04/19(Tue) 16:25:42 編集(投稿者)
>
>   日本語でおkだったので修正...
>
> ■No28482に返信(はちまきさんの記事)
>>TRY処理の括りでBeginTrans()を実施し
>>DELETE処理を実施後、INSERT処理を実施した場合に
>>INSERT処理で重複エラーがでます。
>>ASP.NETの仕様でしょうか。
>
> 少なくとも ASP.NET テクノロジとは無関係なところだと思いますが...
> かといって、.NET Framework (SqlClient) もしくは RDBMS の仕様というわけでもないと思います。
>
> 単純に、期待どおりのレコードが削除できていないか、あるいは INSERT で追加されるレコードのユニーク キーが期待どおりでないかのどちらかだと思います。
> SQLManager はラッパークラスだと思いますが、この内部実装がまずくてトランザクション処理が無視されている可能性も勿論あります。

じゃんぬねっとさん

 アドバイス、ご指摘有難う御座います。
 ソースを印刷し、ER図と照らし合わせて
 机上デバッグを実施ました。コーディングミスがありました。

 お騒がせして申し訳ございません。
 以後、十分に気をつけます。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板