0
排他ロックについての疑問
java+mysqlでアプリを作っていますが、mysqlのマニュアルに「排他ロック:他のトランザクションからはデータの参照も更新もできません」とあるけど、実際はselect * for updateをしても、普通に別のコネクションからはselect *をすればデータを参照できます。なぜでしょうか?
0
java+mysqlでアプリを作っていますが、mysqlのマニュアルに「排他ロック:他のトランザクションからはデータの参照も更新もできません」とあるけど、実際はselect * for updateをしても、普通に別のコネクションからはselect *をすればデータを参照できます。なぜでしょうか?
0
コードが間違ってるか、参照しているレコードが違うか、す
でに更新し終わってるか、jdbcがおかしいか。
0
別に普通だと思うんですが。。。
Javaの話題から離れるので余り突っ込んだ内容は書きませんが、
MySQLの修飾無しSELECTは、DB2等と違い共有ロックを発生させません。
このため、排他ロックのかかったレコードに対してもロックの衝突は起きません。
0
そうなのか。やはりまだDB周りは弱いなあ…。
0
つまり、「排他ロック:他のトランザクションからはデータの参照も更新もできません」という文そのものが間違っており、正しくは「排他ロック:他のトランザクションからはデータのロック保有ありの参照も更新もできません」ということでしょうか?
0
概ねその理解で問題ありませんが、
排他ロック、共有ロックを良く調べてみることをオススメします。
要は、
・ロックが衝突するとWAITが発生する。
・発行するクエリ毎に発生するロック種別が異なる。
ということで、更新・参照が出来ないと括るのは少し乱暴です。
また、そもそもMySQLのマニュアルには、
ご指摘のように記載されている箇所は見当たりませんでした。
PostgreSQL,SQL Server等の解説記事を勘違いされて読まれていませんか?
通常DBにはトランザクション分離レベルがいくつか用意されており、
どのレベルにするか(デフォルトがどのレベルか)で共有ロックの係り具合が
異なります。
大分Javaから離れてしまいましたので、ここら辺で退散します
0
了解しました。Javaとは関係ないことに回答していただいてありがとうございました。
質問から6ヶ月以上経過しているので、回答を書き込むことはできません。