Mysqlのinnodbとphpを使っています。
現在Mysqlの勉強中なのですが
下記のようなプログラムを書いた時に
『//ユーザーデータ取得③』で$userDataの中身はarray( userId => '1234', userName => 'かきくけこ');になっていて欲しいのですが'あいうえお'のままとなってしまいます。
プログラム終了後にdbの値を確認すると'かきくけこ'に更新されています。
$userId ='1234'; $afterUserName ='かきくけこ'; //ユーザーデータ取得① ★参照用DBに接続★ $userData = getUserData($userId); //$userDataの中身はarray( userId => '1234', userName => 'あいうえお'); //ユーザーデータ更新② ☆更新用DBに接続☆ updateUserData($userId,$afterUserName); //$userDataの中身のuserNameを'かきくけこ'に更新 //ユーザーデータ再取得③ ★参照用DBに接続★ $userData = getUserData($userId); //$userDataの中身がarray( userId => '1234', userName => 'あいうえお');のまま・・・
参照用のDBサーバと更新用のDBサーバは別のもので、クエリログを見ると接続識別子も参照時のものと更新時のものは別IDになっていました。
下記のように書き換えると『//ユーザーデータ取得③』で$userDataの中身はarray( userId => '1234', userName => 'かきくけこ');になっていた・・
$userId ='1234'; $afterUserName ='かきくけこ'; //ユーザーデータ取得① ★参照用DBに接続★ $userData = getUserData($userId); //$userDataの中身はarray( userId => '1234', userName => 'あいうえお'); //ユーザーデータ更新② ☆更新用DBに接続☆ updateUserData($userId,$afterUserName); //$userDataの中身のuserNameを'かきくけこ'に更新 //ユーザーデータ再取得③ ☆更新用DBに接続☆ $userData = getUserData($userId); //$userDataの中身がarray( userId => '1234', userName => 'あいうえお');のまま・・・
なぜこうなるのかググったりしていろいろ調べたところ「DBインスタンス」「スレッド」「ロック」と言われるものが関係してるのかな??と予想し、
私の中での結論は
「異なるスレッドで更新された内容はスレッドを再度作らないと取得できない。自スレッドでの更新内容はすぐに取得できる・・・・?????」
となりました。
この結論はあっているのでしょうか・・・?
周りに聞ける人もおらずそもそも「DBインスタンス」「スレッド」「ロック」等もいまいち理解しきれていない(ググってもちょっと難しかった・・)ので
間違っている or 補足できそうなところがあれば教えて頂きたいです・・・
>miyahanさん
説明が不十分で申し訳ありません・・
ソースコードの公開はちょっと厳しいです・・すみません。。
「updateUserData」はユーザーのデータをupdateする関数で「getUserData」がユーザーデータを取得する関数になります。
>kei344さん
ご指摘ありがとうございます・・!
その機能を知りませんでした・・確かにそっちの方が見やすいです・・
今後はそのようにします!
回答1件
あなたの回答
tips
プレビュー