
■SELECT FOR UPDATEとは、
複数のプログラムで在庫の更新などが行われる場合に、
使用するべきでしょうか?
■SELECT FOR UPDATEのロック期間は、他の更新が待たされるのは
下記2.~3.の間でしょうか?
バッチ更新(5分)
1.トランザクション開始
2.SELECT FOR UPDATE
3.UPDATE
4.トランザクション終了
■上記2.のSELECT FOR UPDATEがおこなれた時点のレコードに対し、
他の場所でSELECT FOR UPDATEした場合、
上記2.の時点のデータがSELECTされるのでしょうか?
それとも、上記3.が終わるまでSELECTを待つのでしょうか?
DBは、MySQL5ですが、DB問わず同じ挙動と思い、
このカテゴリに質問されていただきました。
No.2ベストアンサー
- 回答日時:
#1回答者です。
#1回答にも書いたように、排他制御はRDBMSにより仕様差があります。一方で様々なオプションがあり、似たような制御にすることも可能です。
MySQLでも、ストレージエンジンの種類で排他単位が変わったり、排他制御の強さや区間を変える様々なオプションがあります。
MySQLについて調べてみました。
>複数のプログラムで在庫の更新などが行われる場合に、
>使用するべきでしょうか?
複数のユーザが接続する環境で、関連する複数の表、あるいは複数の行を検索、更新する場合に使います。
>SELECT FOR UPDATEのロック期間は、他の更新が待たされるのは
>下記2.~3.の間でしょうか?
FOR UPDATE指定でSELECT実行~トランザクション終了までです。
>上記2.のSELECT FOR UPDATEがおこなれた時点のレコードに対し、
>他の場所でSELECT FOR UPDATEした場合、
>上記2.の時点のデータがSELECTされるのでしょうか?
>それとも、上記3.が終わるまでSELECTを待つのでしょうか?
FOR UPDATE同士の検索が複数ユーザからあると、先に検索した側がその行を占有するため、後続ユーザは排他待ちになります。待ち解除されるのは、先行ユーザがCOMMITしてくれた時点です。
マニュアル参照先
http://dev.mysql.com/doc/refman/4.1/ja/commit.html
http://dev.mysql.com/doc/refman/4.1/ja/innodb-lo …
http://dev.mysql.com/doc/refman/4.1/ja/innodb-tr …
マニュアルの参照先までありがとうございます。
MySQLコマンドを2つ起動して、
やってみたところ、排他待ちになりました。
制御はRDBMSにより仕様差が結構あるのですね。。
1.BEGIN
2.処理
3.BEGIN
でもコミットされてしまいました。
とりあえずファイルロックで逃げる事にしましたが、
ロックはなかなか奥が深く難しいですね。
DBを変えたら試行錯誤が必要と感じました。
No.1
- 回答日時:
>DBは、MySQL5ですが、DB問わず同じ挙動と思い、
>このカテゴリに質問されていただきました
排他制御の挙動は、RDBMS毎に相当な違いがあります。
MySQLについて知りたいなら、MySQLのカテゴリで質問してください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SELECT文でのデッドロックに対...
-
SELECT時の行ロックの必要性に...
-
Oracleの排他制御について教え...
-
SQLServer Insertが遅い
-
INSERTにおいてロック処理は必要か
-
max+1で初番する場合 for updat...
-
UPDATE文で発生するデッドロッ...
-
SELECT文でタイムアウト...
-
デットロックとFOR UPDATE
-
デッドロックに関しての質問
-
DB2でSelectした時(rollback,c...
-
排他ロックしたレコードが、別...
-
SQL Server2005で変換デッドロ...
-
同時書き込み
-
「マスタ」と「テーブル」の違...
-
Access VBA [リモートサーバー...
-
SQL Server のデータをCSVファ...
-
accessのエクスポートエラーに...
-
ACCESSのSQLで、NULLかNULLでな...
-
列名XXXXが無効です
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SELECT文でのデッドロックに対...
-
SQLServer Insertが遅い
-
SELECT時の行ロックの必要性に...
-
accessのロック
-
AccessShareLock はどの程度気...
-
Oracleの排他制御について教え...
-
更新ロックとデッドロック
-
INSERTにおいてロック処理は必要か
-
DB2のロック調査
-
排他ロックしたレコードが、別...
-
トランザクションとlast_insert_id
-
トランザクション中にSELECTし...
-
SELECT文でタイムアウト...
-
デッドロックが発生します。
-
ExcelからAccess2013DBを更新す...
-
DB2でSelectした時(rollback,c...
-
UPDATE文で発生するデッドロッ...
-
トランザクション処理について
-
SELECT FOR UPDATE にトランザ...
-
パススルークエリでのロックに...
おすすめ情報