C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: ADO.NETによるOracleの排他制御


(過去ログ 101 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■60484 / inTopicNo.1)  ADO.NETによるOracleの排他制御
  
□投稿者/ Fim (1回)-(2011/07/05(Tue) 14:50:00)

分類:[VB.NET/VB2005 以降] 

下記のようなコーディングをしたところ、更新処理をコミットされるまで他のトランザクション(別ユーザ)がテーブルに更新出来ない現象が発生致しました。

楽観的排他を行なう場合はどのようなコーディングが必要でしょうか?

実行環境OS:WindowsXP
.NETのバージョン:.NET Framework2.0
データベース:Oracle8I

以下、ソース
------------------------------------------------------------------------

'接続オブジェクトをインスタンス化します。
Me._con = New OracleConnection(Me._ocsb.ConnectionString)

'データベースに接続します。
Me._con.Open()

'コマンドオブジェクトをインスタンス化します。
Me._cmd = New OracleCommand()

'コマンドオブジェクトに接続オブジェクトを引き渡します。
Me._cmd.Connection = Me._con

'トランザクションを開始します。
Me._tran = Me._con.BeginTransaction()

'コマンドオブジェクトにトランザクションを引き渡します。
Me._cmd.Transaction = Me._tran

'SQLを設定します。
Dim sql As String = "*更新SQL*"

'SQLを実行します。
Me._cmd.CommandText = sql

'この処理間に更新対象テーブルが他のトランザクションからアクセス出来なくなります。

'コミット処理を行います。
Me._tran.Commit()

------------------------------------------------------------------------

引用返信 編集キー/
■60492 / inTopicNo.2)  Re[1]: ADO.NETによるOracleの排他制御
□投稿者/ Fim (2回)-(2011/07/05(Tue) 22:00:14)
失礼いたしました、ソースに誤りがありました。

------------------------------------------------------------------------
Imports System
Imports System.Data
Imports System.Data.OracleClient


'接続オブジェクトをインスタンス化します。
Me._con = New OracleConnection(Me._ocsb.ConnectionString)

'データベースに接続します。
Me._con.Open()

'コマンドオブジェクトをインスタンス化します。
Me._cmd = New OracleCommand()

'コマンドオブジェクトに接続オブジェクトを引き渡します。
Me._cmd.Connection = Me._con

'トランザクションを開始します。
Me._tran = Me._con.BeginTransaction()

'コマンドオブジェクトにトランザクションを引き渡します。
Me._cmd.Transaction = Me._tran

'SQLを設定します。
Dim sql As String = "*更新SQL*"

'SQLを実行します。
Me._cmd.CommandText = sql
Me._cmd.CommandType = commandType
Me._cmd.ExecuteNonQuery()

'この処理間に更新対象テーブルが他のトランザクションからアクセス出来なくなります。

'コミット処理を行います。
Me._tran.Commit()

------------------------------------------------------------------------
引用返信 編集キー/
■60493 / inTopicNo.3)  Re[2]: ADO.NETによるOracleの排他制御
□投稿者/ 囚人 (611回)-(2011/07/06(Wed) 00:28:47)
Oracle自体には詳しくないですが、肝心のSQLを書かないと誰もわかりませんよ。「他のトランザクション」っていってるSQLが別ならそれもあれば尚良しかと。
引用返信 編集キー/
■60494 / inTopicNo.4)  Re[2]: ADO.NETによるOracleの排他制御
□投稿者/ やじゅ (1923回)-(2011/07/06(Wed) 06:27:23)
やじゅ さんの Web サイト
No60492 (Fim さん) に返信

Fim さんの更新SQLがどのようなものかによりますが、
DataSetなどの非接続型を使った方法でないと、楽観的排他は出来ないです。

下記サイトで仕組みが若干分かるかと思われます。
(ADO.Net)DataSetを使ったトランザクション制御
http://jehupc.exblog.jp/10243687/
引用返信 編集キー/
■60519 / inTopicNo.5)  Re[3]: ADO.NETによるOracleの排他制御
□投稿者/ 甕星 (3回)-(2011/07/06(Wed) 14:40:07)
以下の部分を削除する。

> 'トランザクションを開始します。
> Me._tran = Me._con.BeginTransaction()
>
> 'コマンドオブジェクトにトランザクションを引き渡します。
> Me._cmd.Transaction = Me._tran
>
> ・・・
>
> 'コミット処理を行います。
> Me._tran.Commit()

Oracleは読取り一貫性を保持するために、明示的にロックしなくとも自動的にレコードやテーブルのロックを行います。これを避けるためにはBeginTransaction、Commitの使用をやめて、AutoCommit任せにすればよいです。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -