銀河鉄道~ぽんこつエンジニアのブログ~

思いつきで書いています。

MySQL5.7でSELECTでロックが保持されてしまう

MySQLで日次バッチ実行中に、ロック待ちタイムアウトが発生しエラーとなりました。

java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction


原因はもう一つ裏で動いていたプロシージャーB。
そのプロシージャー内の処理で、以下のように記述をしていた箇所で、
なぜか行ロック(Sロック)を取得していました。

※カーソルによるループ

start transaction;

    if exists( select 1 from t_table where id = xxxx ) then
        /* 何らかの処理 */
    end if;

commit;


そのため、プロシージャーAでt_tableのid = xxxx のデータをUPDATEしようとしてロック待ちが発生し、
プロシージャーBの処理が長引いたため、タイムアウトが発生したようです。

select ~ for updateをつけているわけでもなく、単純なSELECT文なのに
Sロックを取得する理由がわからず...。
ちなみに分離レベルは、REPEAD TABLEでした。

いったん上記を下記のように修正したところ、ロックを取得することはなくなりました。

※カーソルによるループ

start transaction;

    select count(*) into HOGE from t_table where id = xxxx;

    if HOGE > 0 then
        /* 何らかの処理 */
    end if;

commit;

MySQL MEMORYストレージエンジンとテンポラリテーブルについて

MySQLは、テーブル作成の際、いくつかのストレージエンジンから選択することができます。デフォルトはInnoDB。その他、MyISM、MEMORYなど様々な種類があります。

 

MEMORYストレージエンジンは、格納されたデータがすべてメモリ上に保持されます。InnDBやMyISMでは、データはハードディスクへ書き込まれるため、読み書きのオーバーヘッドがなく、IOが非常に高速になります。

 

ただし以下の注意点があります。

1、メモリ上にデータを保持するため、DBサーバーが落とされると格納されたデータは消える。(空のテーブルのみ残る。)

2、ロック制御がテーブルロック(MyISMと同様、InnoDBは行ロック)のため、並列処理でパフォーマンスが落ちやすい。

3、カラムはすべて固定長にへんかんされるため、一レコードのバイト数が多くなる。また、BLOB、TEXTは使用できない。

4、インデックスは「HASH」がデフォルト。InnoDBやMyISMは「BTREE」がデフォルト。どちらも使用可能。「HASH」は場合によって遅くなる可能性あり。

 

2、の解決案として、一時テーブル(Temporary Table)として使えば、クライアントごとに別々になるため並列処理が起きにくくできる。結果、パフォーマンスを保てるのではないか。

 

ただ、一時テーブルは指定の容量を超えると自動的にInnoDBに変換されるため、変換コストが発生するという話もあるが、、、

 

(以下追記)

⇒ユーザーが作成したMERORYテーブルは変換されないと公式に見つけた。

⇒CREATE TEMPORARY TEBLEで作成されたMEMORYテーブルは自動変換されない。自動変換されるのはあくまで、内部的に自動で作られる一時テーブルのみ。

 

 

 

 

truncate tableと制約

truncate tableは、外部キーなど制約がかかっているとエラーになる。

相手側テーブルにデータがあってもなくても同様。
制約を解除するか、DELETE文で削除する。

straight_join

一般的には、joinの順序はオプティマイザが一番効率の良い順序を探し、

その順番で実行してくれます。

しかし、まれにそれよりもレスポンスの良い順序に指定したい場合があります。
MySQLでは、そのような場合、joinの代わりに、straight_joinを使います。
 
straight_joinは、左のテーブルの次に右のテーブルを読み込むことを強制します。
ある場合においてはstraight_joinを使用することでパフォーマンスが改善する可能性があります。
 
ただし、オプティマイザは、データ数やSQLの条件によって順序を決めていますので、
straight_joinを使って順序を固定することで逆にパフォーマンスが落ちる可能性もあります。

ConcurrentModificationException

javaで、コレクションをfor文などで回している最中に、そのコレクションに対して変更を加えた場合に発生する。

 
対策:
別のコレクションを用意する

ビリギャルを見てきました。

友人に誘われ、ビリギャルを見てきました。

内容としては高校受験の女子高生を主人公としたお話しなので
受験生やその親御さんには現実とリンクしてみれるのはもちろんですが、
やりたいことがみつからない若者や仕事で行き詰っている人たちにも得るものがある映画だと思います。

一番感じたのは、「自分はここまでがんばったことがあったかな」ということ。自分を振り返ってみて、
何かと理由をつけてがんばることを避けてきたような気がしました。
人生で一回くらいがんばってみてもいいのかなと感じました。

そして「人の幸せのために働く仕事」
自分の仕事は、働き方はどうなんだろうと考えました。

映画自体は受験の話ですが、それを中心に、映画をみる人それぞれによって、それぞれのテーマで見られる映画だと思います。

賛否両論な意見もあるようですが、批判的な目で見ればたぶん突っ込みどころはたくさんあるんでしょう。
そんな見方をするのはもったいない映画です。


素直な気持ちで見れれば、見終わった後に、良い刺激を受けられたと感じられる映画だと思います。

 

オリンパス PEN Lite E-PL1

ミラーレス一眼を買いました。

中古です。
オリンパスE-PL1Canon FD50mm F1.4というオールドレンズの組み合わせです。
カメラとレンズとアダプター、合わせて17000円くらいでした。
f:id:giovanni0517:20150628022016j:image

写真はずっとiPhoneで撮っていて、それはそれで便利だったんだけど、
まえまえからミラーレス一眼レフが欲しかったんですが、値段も高いので諦めてました。

そんな折、中古で型落ちなら、全部入れて2万切ることがわかり、
しかも偶然、E-PL1にオールドレンズ付けてる写真を見て、
一目惚れし衝動買いしてしまいました。

レンズはフィルムカメラと時代のものですが、
Canonの標準レンズと言われた単焦点レンズだけあって十分使えます。

とはいえ、もともとマイクロフォーサーズE-PL1にアダプターを介して
FDレンズをつけているので、AFなんてありません。
ピント合わせはマニュアルオンリーです。
アダプターについては、中国製のリーズナブルなやつを買いましたが、
全くカタカタいうこともなくしっかり固定できてます。
もしかしたら当たりハズレがあるかもしれませんが…。

しばらくは素敵なおもちゃになりそうです。