プロが教える店舗&オフィスのセキュリティ対策術

お世話になります、
さくらのレンタルサーバを使っているのですが
テーブル更新時に更新対象テーブルにロックを
かけようとして、動作確認をしているのですが
phpmyadminから
lock tables *** writeを実行した後
select文を発行するとそのままselectが
動いてしまうのですが、なにかテーブルロックに
関して間違った理解をしているのでしょうか?
伝票NOテーブルのようなものは重複を防止する為に
排他かけないと駄目だと思うのですが、
それとも更新クエリが発行された時に自動で
排他制御がかかるのでしょうか?
わからなくなってきました。
宜しくお願いいたします。

A 回答 (2件)

>>端末(2)でselect ~


をphpから実行するとやはり見えます。

ネットの情報では、MyISAMでもロックされるように思えるのですけどね。レンタルサーバじゃあなく、自分のPC上で似たような環境での再現テストをやられるのがいいかな?と思えます。

>>デッドロックフリーとはデッドロックを
回避していると考えてよいのでしょうか?

そうですね。デッドロックにならないということのようですが、ただ、複数テーブルの関係する処理であれば、デッドロックもありえると思えます。もちろん、MyISAMでロックが機能しないなら、デッドロックにならないけど(笑)

ただ、MyISAMのロックが行ロックじゃあなくテーブルロックとのことですので、更新が多い場合は、使えないと思ったほうがいいと感じます。

P.S.
昔、MSのSQLServerで、ロックエスカレーションからテーブルロックになって、大変なトラブルになった事例がありますので・・・。
最新バージョンのSQLServerの仕様は知らないのですけどね。
    • good
    • 0
この回答へのお礼

>>レンタルサーバじゃあなく、自分のPC上で似たような環境での再現テストをやられるのがいいかな?と思えます。

アドバイス有難うございました、
面倒がらずに最初から自分のPCで確認すれば
よかったです。無事?ロックされました。

ユニークNOの取り出し&更新はMYSQLの外に
出すしかないみたいです。

お世話様でした。

お礼日時:2009/05/14 17:27

>>lock tables *** writeを実行した後


select文を発行するとそのままselectが
動いてしまうのですが、

lockは他人あるいは、他プロセスやスレッド等にデータを改変されないように、あるいは見られないようにするものですよね?
なので、selectを同じphpmyadminから発行しての動作ならOK.
他のプロセスやブラウザから発行して動作するならなんらかの問題ありと思えますけど。

ちなみに、手元のMySQLを使うRailsアプリで試したら、adminツールからロックすると、ブラウザーからのselectはブロックされ、unlockすると、実行されました。

この回答への補足

>>なので、selectを同じphpmyadminから発行しての動作ならOK.
他のプロセスやブラウザから発行して動作するならなんらかの問題ありと思えますけど。

了解しました。
で、端末(1)からlock tables ** write
端末(2)でselect ~
をphpから実行するとやはり見えます。
ここのサーバはMyISAMしか使えないの
ですがMyISAMでもlockは問題ないのでしょうか?
色々サイトを見ていたらinnoDBじゃないと
いけないようなこととか、MyISAMでlockの
場合はデッドロックフリーになるとかの
記述があって混乱しています。
デッドロックフリーとはデッドロックを
回避していると考えてよいのでしょうか?
なんか色々ややこしくなって申し訳ありません。
宜しくお願いします。

補足日時:2009/05/14 12:23
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!