アプリ版:「スタンプのみでお礼する」機能のリリースについて

プログラム初心者です

mysqlでトランザクションを使いたいです

いままでMyISAMを使ってきました。これをInnoDBにするだけで同時アクセスが可能になるのでしょうか?

sqlのupdateもトランザクションは効くのでしょうか?

pdoのほうでなにかやることはありますか?こんな感じのupdateを実行したいです

$pdo->prepare('UPDATE point_table SET point = point+1 WHERE id = ?');
$stmt->bindValue(1, 15, PDO::PARAM_INT);
$stmt->execute();

よろしくお願いします

A 回答 (3件)

画像小さくなっちゃったのでこっちで↓


http://qiita.com/mpyw/items/b00b72c5c95aac573b71 …
    • good
    • 0
この回答へのお礼

見やすかったです
簡単な加算だとなしでもいいのですね。勉強になりました。ありがとうございます

お礼日時:2014/03/26 21:00

素晴らしい記事を見つけました。



MySQLのトランザクション分離レベル
http://tree-tips.appspot.com/mysql/transaction_i …

ロストアップデートの有無を見るためのスクリプトを2つ用意します。point_tableにあらかじめレコードを1つだけ入れておいてください。Aを実行後10秒以内にBを実行し、2つのスクリプトがどちらも実行完了したあとの結果がどうなるかを、「//」のコメントアウトがある場合と無い場合で比較してみてください。

[スクリプトA]
// $pdo->exec('SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE');
$pdo->beginTransaction();
$point = $pdo->query('SELECT point FROM point_table')->fetchColumn();
sleep(10);
$pdo->exec('UPDATE point_table SET point = ' . ++$point);
$pdo->commit();

[スクリプトB]
// $pdo->exec('SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE');
$pdo->beginTransaction();
$pdo->exec('UPDATE point_table SET point = point + 100');
$pdo->commit();

RepeatableReadの方では「+1」、Serializableの方では「+101」される結果になると思います。ただしこのようにSerializableレベルでトランザクション分離が必要になるケースは非常に稀です。「同時アクセス」という言葉でくるめてしまわずに、自分が必要としている最低限度のレベルを探してみてください。むしろ単純に加減算する程度ならばトランザクション処理の必要性すら無くなったりします。
「同時アクセスについて」の回答画像2
    • good
    • 0
この回答へのお礼

回答ありがとうございます
トランザクションもいろいろレベルがあるのですね
自分が考えていたよりも奥が深かったのです(汗

お礼日時:2014/03/26 20:58

毎度毎度になりますがまとめ貼りますね(笑)



Qiita - PHPでデータベースに接続するときのまとめ #トランザクション処理
http://qiita.com/mpyw/items/b00b72c5c95aac573b71 …

InnoDBは4レベルのトランザクション分離をサポートしており、一番安全なようにアクセスごとに完全分離させたいならば

$pdo->exec('SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE')

を実行してください。
    • good
    • 0
この回答へのお礼

回答ありがとうございます
なんとか出来た?と思うのですが、見た目が変わらないのでなんともいえません
トランザクションが成功しているか確認する方法はありますか?

お礼日時:2014/03/26 03:11

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