Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

排他ロックについての疑問

java+mysqlでアプリを作っていますが、mysqlのマニュアルに「排他ロック:他のトランザクションからはデータの参照も更新もできません」とあるけど、実際はselect * for updateをしても、普通に別のコネクションからはselect *をすればデータを参照できます。なぜでしょうか?

6

回答

86953

閲覧

6件の回答

評価

0

コードが間違ってるか、参照しているレコードが違うか、す
でに更新し終わってるか、jdbcがおかしいか。

評価

0

別に普通だと思うんですが。。。

Javaの話題から離れるので余り突っ込んだ内容は書きませんが、
MySQLの修飾無しSELECTは、DB2等と違い共有ロックを発生させません。

このため、排他ロックのかかったレコードに対してもロックの衝突は起きません。

評価

0

そうなのか。やはりまだDB周りは弱いなあ…。

評価

0

つまり、「排他ロック:他のトランザクションからはデータの参照も更新もできません」という文そのものが間違っており、正しくは「排他ロック:他のトランザクションからはデータのロック保有ありの参照も更新もできません」ということでしょうか?

評価

0

概ねその理解で問題ありませんが、
排他ロック、共有ロックを良く調べてみることをオススメします。
要は、
・ロックが衝突するとWAITが発生する。
・発行するクエリ毎に発生するロック種別が異なる。
ということで、更新・参照が出来ないと括るのは少し乱暴です。

また、そもそもMySQLのマニュアルには、
ご指摘のように記載されている箇所は見当たりませんでした。
PostgreSQL,SQL Server等の解説記事を勘違いされて読まれていませんか?

通常DBにはトランザクション分離レベルがいくつか用意されており、
どのレベルにするか(デフォルトがどのレベルか)で共有ロックの係り具合が
異なります。

大分Javaから離れてしまいましたので、ここら辺で退散します

評価

0

了解しました。Javaとは関係ないことに回答していただいてありがとうございました。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。