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は、外部キーなど制約がかかっているとエラーになる。
straight_join
一般的には、joinの順序はオプティマイザが一番効率の良い順序を探し、
ビリギャルを見てきました。
友人に誘われ、ビリギャルを見てきました。
内容としては高校受験の女子高生を主人公としたお話しなので
受験生やその親御さんには現実とリンクしてみれるのはもちろんですが、
やりたいことがみつからない若者や仕事で行き詰っている人たちにも得るものがある映画だと思います。
一番感じたのは、「自分はここまでがんばったことがあったかな」ということ。自分を振り返ってみて、
何かと理由をつけてがんばることを避けてきたような気がしました。
人生で一回くらいがんばってみてもいいのかなと感じました。
そして「人の幸せのために働く仕事」
自分の仕事は、働き方はどうなんだろうと考えました。
映画自体は受験の話ですが、それを中心に、映画をみる人それぞれによって、それぞれのテーマで見られる映画だと思います。
賛否両論な意見もあるようですが、批判的な目で見ればたぶん突っ込みどころはたくさんあるんでしょう。
そんな見方をするのはもったいない映画です。
素直な気持ちで見れれば、見終わった後に、良い刺激を受けられたと感じられる映画だと思います。