- PR -

[ADO.NET]データベースのレコードロックの仕方

1
投稿者投稿内容
きん
会議室デビュー日: 2003/01/10
投稿数: 11
投稿日時: 2003-05-28 16:06
DBのあるテーブルを行ロックしたいのですが、下記のようにFOR UPDATEを指定するとエラーになってしまいます。
何か良い方法はありますでしょうか??

----------------------
Dim OleDbConnection = New System.Data.OleDb.OleDbConnection()
OleDbConnection.ConnectionString = "Provider=MSDAORA.1;Password=XXX;User ID=YYY;Data Source=ZZZ"

Dim OleDbCommand = New System.Data.OleDb.OleDbCommand()
OleDbCommand.CommandText = "SELECT * FROM TABLE_A WHERE ID = 'AAA' FOR UPDATE"

OleDbConnection.Open()
Dim reader As OleDb.OleDbDataReader
reader = OleDbCommand.ExecuteReader()
While reader .Read()←エラー発生。SELECT文のFOR UPDATEを外せば通りますが。。。
・・・
End While
OleDbConnection.Close()



999
会議室デビュー日: 2003/05/17
投稿数: 14
投稿日時: 2003-05-28 16:56
質問の意味を間違って解釈してたら、すみません。

OleDbDataReaderはデータ ソースからデータ行の前方向ストリームを読み取るため、
使用中は、関連付けられた OleDbConnection は、 OleDbDataReader によって使用されるためビジー状態です。
Close メソッドを呼び出すまでこの状態が続きます。

ロック後、更新処理を行うと思いますが、記述どおりロックを行えたとしても、
OleDbCommandによる更新処理が行えません。

ロックを行いたいだけなら、OleDbCommand.ExecuteNonQuery()のみで良いと思います。
データを取得したい場合は、OleDbDataAdapterを介し、DataSet(DataTable )に格納しみては。

サンプルにはトランザクションが記述されていませんが、
OleDbTransaction によるトランザクションを行った方がいいと思います。

tpkr
ベテラン
会議室デビュー日: 2003/02/24
投稿数: 55
投稿日時: 2003-05-29 17:42
“FOR UPDATE”はOracleの構文だから汎用のADO.Netでは通らないんだと思います。
きん
会議室デビュー日: 2003/01/10
投稿数: 11
投稿日時: 2003-05-29 18:03
回答ありがとうございました!
トランザクションのオブジェクトを追加したらエラーでなくなりました。
データの更新はデータセットから取らないと確かに駄目でした。

---------------------------------
Dim OleDbConnection = New System.Data.OleDb.OleDbConnection()
OleDbConnection.ConnectionString = "Provider=MSDAORA.1;Password=XXX;User ID=YYY;Data Source=ZZZ"

Dim OleDbCommand = New System.Data.OleDb.OleDbCommand()
OleDbCommand.CommandText = "SELECT * FROM TABLE_A WHERE ID = 'AAA' FOR UPDATE"

Dim tran As System.Data.OleDb.OleDbTransaction←追加
tran = OleDbConnection.BeginTransaction(IsolationLevel.ReadCommitted)←追加
OleDbCommand.Transaction = tran←追加

OleDbConnection.Open()
Dim reader As OleDb.OleDbDataReader
reader = OleDbCommand.ExecuteReader()
While reader .Read()←FOR UPDATEでレコードロック。
・・・
End While
OleDbConnection.Close() ←レコードロック解除
1

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