プロが教えるわが家の防犯対策術!

ODBC-JDBCブリッジドライバを使用してJAVA⇒AccessMDBにアクセスしています。
基本的な質問で申し訳ございません。

○テーブルの構成
 テーブル・・・登録数テーブル
 カラム・・・登録数
(1レコード1カラムのみのテーブルで登録数を管理するカウントマスタみたいなもの)

○JAVAアプリケーション
 Connection 開始
 UPDATE 登録数テーブル SET 登録数 = 登録数 + 1
 SELECT 登録数 FROM 登録数テーブル ⇒登録数を標準出力
 COMMIT
 Connection 終了

○質問
 上記アプリケーションをマルチ(多重)で動かした場合でも
 登録数は1ずつカウントアップしますでしょうか?

 言い方を変えますと必ず最初にUPDATEしたトランザクションが
 コミットするまで他のトランザクションはUPDATEできないと思って
 よろしいでしょうか?

A 回答 (1件)

ORACLEのシーケンスなどのようにトランザクションに左右されず必ずアトミックにインクリメントされるようなDBオブジェクトでない限り、値は重複しますよ。



登録数:0の状態で、Aセッション、Bセッションがほぼ同時に動いたとします。

AセッションのUPDATE→1にインクリメント
BセッションのUPDATE→1にインクリメント

AセッションCOMMIT
BセッションCOMMIT(AのCOMMITを待ってから)

最終的な登録数:1

と言う事で要件を満たす事はできません。

setTransactionIsolationの分離レベルを何で定義するかにもよりますが、そもそもAccess
の mdb では4モードすべてをサポートしていないだろうし、仮に一番シビアなSERIALIZABLEが指定できたとしても同時アクセスが繁多であれば、あっと言う間にデッドロックの嵐で動かなくなる事、必至だと思います。
(この辺は詳しくないので、このカテの識者のご意見を伺いたいところです)

本題から外れますが、削除された質問について言えば、AccessにはFOR UPDATEの類のロックを制御すつ句はありません。
また、ロックの単位はページレベルロックですので、ORACLEのように行をターゲットしてロックする事もできません。

さらに本題とは外れますが、Accessのmdbは、このような複数セッションからの同時更新には向きません。
(よく破損します)

せめて、MySQL か PostgreSQL にした方がいいと思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!