cakephpのsaveを使用してMySQL(MyISAM)にデータを保存する際のテーブルロックについて質問させてください。


使用するデータベースがMySQL(MyISAM)の場合、cakephpのソース上でロック処理を書かなくてもsaveを実行した段階で自動的にテーブルロックがかかるのでしょうか?

また、ロックがかかる場合、それは排他ロックではなく、共有ロックという認識で問題ないでしょうか?

プログラミング初心者で質問も分かりにくいものになっているかもしれませんが、どうかご教示ください(検索方法がいけなかったのか、ネットで答えを見つけることができませんでした)

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2011/06/30 01:25:03

回答1件)

id:tdoi No.1

回答回数174ベストアンサー獲得回数75

利用するCakePHPのバージョンにもよるかもしれませんが、僕が知る限りロックは明示的にしてあげる必要があります。CakePHP1.2から導入されたらしいトランザクションを使えればいいのでしょうが、MyISAMでは使用できません。

そこで、MySQLのロックが必要なのであれば、Model::save()を呼び出す前に、Model::query()を使って"LOCK TABLES XXXX"というコマンドを実行させればいいでしょう。また、それを行うためのビヘイビアを定義してしまうのもいいかもしれません。

何かの参考になれば。

id:cre_bo

tdoiさん、ご回答ありがとうございます。

頂いた回答をヒントに実際、作成してみようと思います。

なお、追加で質問してしまって申し訳ございませんが、共有ロックにするか排他ロックにするかもプログラム側で指定するのかご教示頂けると幸いです

2011/06/23 23:10:29
  • id:tdoi
    えっと、共有ロックにするか、排他ロックにするかは、Model::queryで実行するクエリ次第です。
    ご質問に答える形であれば、プログラム側でどちらのロックを利用するかを指定します。

    参考:
    http://dev.mysql.com/doc/refman/4.1/ja/innodb-locking-reads.html
  • id:cre_bo
    tdoiさん、ありがとうございました。
    頂いた情報を元に色々調べた結果、今まで分からなかったDB周りの仕組みが理解できてきました。

    本当にありがとうございました

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません