初めまして。
まだ初心者の身なのですが質問させてもらいます。
サーブレット・jspでJDBCを使いデータベースとの処理を行って簡単なショッピングサイトのようなものを作っています。
まずsetAutocomit() = falseでトランザクションを開始し
データベースのUPDATEを行って、最後に確定する場合comit
キャンセルする場合rollbackとしています。
しかし1人のユーザーがトランザクションを行っている場合に他のユーザーからアクセスされた場合にデータベースのトランザクション中の値を取ってきたいのですが、どうしてもトランザクションでUPDATEされる前の値になってしまうのです。
これを防止するのが排他制御というものだというのは分かったのですが
実際のやり方については、結構調べたのですがあまり載っていませんでした。
データベースはMySQLを使っています。
よろしければJDBCでの排他制御についてのアドバイス、もしくは詳しく説明されているサイトなどございましたら是非教えてください。
よろしくお願いします。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
仰るような用途ですとACID特性に反するため、トランザクション以外で考える必要があるように思います。
ですが実現するのはかなり難しい気がします。
例えば、ユーザ1がロールバックする前にユーザ2がコミットした場合はどうなるか等、何らかの矛盾が発生するはずです。
No.2
- 回答日時:
Postgresの詳しい中身はわからないですが、普通のRDBMSはレコード単位のロックを行ってトランザクションを隔離しているはずです。
ですので、同じ行に対して2つのトランザクションが更新しようとした場合、後で更新しようとした方のトランザクションが待つことになります。
回答ありがとうございます。
ということは先ほどの例は行えないのですか?
しかし1人のトランザクションが終わるまで他のユーザーがUPDATEできないとなると少し効率の悪いシステムになりますね。
トランザクション以外の方法も考えてみたいと思います。
No.1
- 回答日時:
質問させていただきたいのですが、試された手順は以下のようなタイミングでしょうか。
1.ユーザ1がトランザクション開始
2.ユーザ2がトランザクション開始
3.ユーザ1がUPDATE
4.ユーザ1がCOMMIT
5.ユーザ2がSELECT
MySQL等の一般的なRDBMSでは、排他レベルというものが設定できますが、一番厳しいものにすると、ユーザ2がSELECTして取得できるデータはユーザ2がトランザクションを開始した段階のデータとなります。
ユーザ2がSELECTして取得できるデータをユーザ1がCOMMITしたデータとしたい場合は、排他レベルを下げる必要があります。
MySQLにおける排他レベルの設定方法は参考URLを参照下さい。
また、排他レベルの詳しい説明はPostgreSQLのドキュメントがお勧めです。
http://www.postgresql.jp/document/pg732doc/user/ …
これで解決できると思いますが、本当に確実な排他制御をしたい場合は、テーブルロックを試されてみてはいかがでしょうか。パフォーマンスが格段に落ちるのでお勧めできませんが…。
http://dev.mysql.com/doc/refman/4.1/ja/lock-tabl …
参考URL:http://dev.mysql.com/doc/refman/4.1/ja/innodb-tr …
この回答への補足
例えば最初のデータベースの値が1としますと
1.ユーザ1がトランザクション開始
2.ユーザ2がトランザクション開始
3.ユーザ1がUPDATE 1→3 +2を行う
4.ユーザ2がSELECT 3
5.ユーザ2がUPDATE 3→6 +3を行う
6.ユーザ1がSELECT 6
7.ユーザ1がROLLBACK 6→4 +2を取り消し
8.ユーザ2がSELECT 4
となるようにしたいのです。
排他レベルについて勉強したのですが
一番低いUNCOMMITTEDに設定しても
上の例で5の位置でロックがかかってしまいUPDATEできなくなってしますのです。
URLについてはありがとうございました。
色々調べてみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- JavaScript Typescript が必要な理由 1 2023/01/07 11:45
- MySQL 【投稿情報用データベース posts】は必要ないと思います。 1 2022/06/02 21:25
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
- PostgreSQL PostgressからMySQL(MariaDB)へ構造を変更する際のTimestamp等について 2 2023/04/04 12:09
- フリーソフト 色々な形式の個人情報を後で参照しやすいようWindow10で管理したいのですが、どんな方法があるの? 1 2023/04/29 16:46
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- その他(データベース) 業務用のデータベースサーバーの選び方について 4 2022/11/22 10:22
- Java 改行含むテキストの表示の仕方 1 2023/06/13 06:44
- Excel(エクセル) エクセル関数のXlookupのフィルハンドル機能(類した機能でも可)を知りたいです。 3 2022/09/20 20:02
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MoveNextの処理速度は?
-
[ASP]If~Else If~End If 対 Case
-
パソコンでインターネット接続...
-
ubuntuで デイスク/deb/loopと...
-
プログラムの規模を表す単位「k...
-
ライン数とステップ数の違いに...
-
hdmiはパラレル?シリアル?
-
CASLとCASL2の違いについて
-
ページ置き換え LRU方式
-
人類の農業まで
-
固定電話機のパソコンとの連動
-
マス目上の移動のアルゴリズム
-
ステップ数について
-
【電気】フリッカー回路ってな...
-
スタック C言語
-
プログラム構造の「再帰的」に...
-
スタックの仕組み
-
パソコンのタイピングソフトは...
-
iPhoneとituneの同期を付属のUS...
-
L2スイッチの管理VLANに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
MoveNextの処理速度は?
-
[ASP]If~Else If~End If 対 Case
-
トランザクションとは何のこと...
-
Excel VBA マクロ処理 リンク先...
-
COBOLのPtoPとは?
-
リフレッシュ処理の意味を教え...
-
パソコンでインターネット接続...
-
プログラムの規模を表す単位「k...
-
ubuntuで デイスク/deb/loopと...
-
ライン数とステップ数の違いに...
-
Macと iPadの違いについて 今現...
-
命令口調について
-
VB.netでDLLを読み込んで実行す...
-
hdmiはパラレル?シリアル?
-
ステップ数について
-
最大スタックサイズを大きくす...
-
エラー?メッセージ
-
サブネットマスクが255.255.255...
-
ステップ数??
-
Ic-PcAn はどこのこと?
おすすめ情報