- PR -

同時実行違反について

1
投稿者投稿内容
chiroru
ベテラン
会議室デビュー日: 2008/10/02
投稿数: 59
投稿日時: 2009-02-10 11:44
言語:Microsoft Visual Studio 2008
データベース:SQL Server 2005 非接続型のデータアクセスです。

いつもお世話になっております。
メンテナンス用プログラムを作成し、同時実行違反のテストを行いたいと思っています。
しかしtry...catchのcatchでDBConcurrencyExceptionを組み込んだのですが、
DBConcurrencyExceptionでエラーが発生しません。
私が行ったテストはメンテナンス画面を2つ起動し、@のところでブレークポイントを付けて
F8ボタンで1ステップ実行をおこないエラーを発生させようとしました。
しかし、SqlExceptionでタイムエラーになるばかりで、DBConcurrencyExceptionでエラーが発生しません。
拙い文章でわかりずらく申し訳ありませんが、どなたかアドバイスをお願い致します。

Try
Dim sqlDA As SqlDataAdapter = New SqlDataAdapter()
Dim ds As DataSet = New DataSet()
Dim sqlCmdBldr As SqlCommandBuilder = New SqlCommandBuilder(sqlDA)
sqlDA.SelectCommand = New SqlCommand()
strsql = "SELECT * FROM T_TBL WHERE (CD = '001')"
sqlDA.SelectCommand.CommandType = CommandType.Text
sqlDA.SelectCommand.CommandText = strsql
sqlDA.SelectCommand.Connection = New SqlConnection(My.Settings.MyAppConnect)
sqlConn = sqlDA.SelectCommand.Connection
sqlConn.Open()
sqlTrans = sqlConn.BeginTransaction(IsolationLevel.Serializable)
sqlDA.SelectCommand.Transaction = sqlTrans
sqlDA.Fill(ds, "TBL")
Dim targetRow As DataRow
targetRow = ds.Tables("TBL").Rows(0)
targetRow.Item("NAME") = .txtNAME.Text
sqlCmdBldr.GetUpdateCommand.Connection = sqlConn
sqlCmdBldr.GetUpdateCommand.Transaction = sqlTrans
sqlDA.Update(ds, "TBL")   ←@ブレークポイント
sqlTrans.Commit()
Catch edbc As DBConcurrencyException
AppErrorHandler(edbc)
Catch esql As SqlException
AppErrorHandler(esql)
Catch ex As Exception
AppErrorHandler(ex)
Finally
If Not sqlTrans.Connection Is Nothing Then
sqlTrans.Rollback()
End If
If Not (sqlConn.State = ConnectionState.Closed) Then
sqlConn.Close()
End If
End Try
デューン
大ベテラン
会議室デビュー日: 2004/04/21
投稿数: 174
お住まい・勤務地: Tokyo
投稿日時: 2009-02-10 12:07
引用:

しかし、SqlExceptionでタイムエラーになるばかりで、DBConcurrencyExceptionでエラーが発生しません。


とは、タイムアウトになることですか?

IsolationLevel.Serializableで、Commitされる直前で止めていれば、そうなる気がします。(ロックされてるので)


DBConcurrencyExceptionはDataAdapterが返却します。
SQLが実行されないと発生しません。
chiroru
ベテラン
会議室デビュー日: 2008/10/02
投稿数: 59
投稿日時: 2009-02-10 13:05
引用:

デューンさんの書き込み (2009-02-10 12:07) より:
引用:

しかし、SqlExceptionでタイムエラーになるばかりで、DBConcurrencyExceptionでエラーが発生しません。


とは、タイムアウトになることですか?

IsolationLevel.Serializableで、Commitされる直前で止めていれば、そうなる気がします。(ロックされてるので)


DBConcurrencyExceptionはDataAdapterが返却します。
SQLが実行されないと発生しません。



確かにCommit後に実行することで解決できました。
ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)