Help us understand the problem. What is going on with this article?

整合性をしっかりとらないといけない処理ではトランザクションをかけるのですが、どうもトランザクションのロック待ちでタイムアウトしてしまうことがあるようです。 java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction トランザクションでテーブル全体にロックがかかってしまう 要するに、「トランザクションを実行するためにロックを獲得しなければいけないが、他のコネクションがロックを握っていて、ロックが獲得できない」ということです。 これの根本的な原因は何かと調べますと、InnoDBでトランザクションを使用するときに、行ロックではなく、テーブル全体にロックがかかってしまう場合がある、というところにたどり着きました。 「InnoDBで行ロック/テーブルロックになる条件」を見ながら、少し試してみます。 テーブ
結構需要があると思うんですが、MySQLでINSERTした時、挿入されたデータのID(Auto IncrementなPrimary Key)が取りたいことってよくあると思います。INSERTが1つだけならLAST_INSERT_ID()を用いて取得することができるのですが、バルクインサート(1つのクエリで複数のデータを挿入)では取得出来ません。今回はそれを取得するための方法をまとめたいと思います。MySQLのバージョンは5.1なので、それ以降のMySQLでは苦労しなくてもうまくいくかもしれません。 問題となるのはどこか おおまかに以下の様なことをやりたいわけです。 バルクインサートしたデータのIDを取得したい(AI+PK) ON DUPLICATE KEY UPDATEで変更されたデータのIDも取得したい こんな感じです。まず1つめの条件を外して、単一のINSERT ... ON DUPL
自分の浅はかな理解だと、Deadlock が起こる理由が説明できないケースに遭遇したので、InnoDB の行レベルロックについて調べてまとめてみました。 「行レベルロックだと、同じ行を更新する場合にしか Deadlock が起こらないんでしょ」と思っているような人が対象です。 また、主に InnoDBのロックの範囲とネクストキーロックの話 - かみぽわーる を参考にさせていただいたので、そちらの内容がすんなり理解できる方には冗長な内容だと思います。 MySQL のバージョンは 5.6.33 です。 サンプルデータ 次の SQL で作成したデータを扱うことにします。 CREATE TABLE `orders` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `product_id` int(10) unsigned NOT NULL, `us
今回は敬語で書きます。ちょっと弱気です。深い理由はありません。 間違っているところがあったらビシバシご指摘ください。 やっとInnoDBが使えるMyISAMよりInnoDBのほうが優位な点が多くなってからだいぶ経つのですが、ウチでは夜間のバックアップをOSファイルコピーでやっていたため「MyISAM縛り」がありました。 最近になってmysqldumpを利用するよう変更するなどして、やっと縛りを取り払うことができました。 本格的にInnoDBを使い始めようと思ってるところです。 しかし、ただ単純にALTER TABLEしてしまえばよいわけではありません。 MyISAMからInnoDBへの移行についてはnippondanji氏のブログでも触れられていますが、いくつか注意すべき点があります。 漢(オトコ)のコンピュータ道: MyISAMからInnoDBへ切り替えるときの注意点 1年半以上まえのエ
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く