• ベストアンサー

ロールバックが動作しない。

ロールバックが動作しない。 以下の文をSQLクライアントで実行するとテーブルに登録されてないはずなのですが、 なぜか登録されています。解決方法を教えてください。 ---------------------------------------------- SET AUTOCOMMIT=0; begin; INSERT INTO テーブル (カラム)VALUES ('AAA'); rollback; -----------------------------------------------

  • MySQL
  • 回答数5
  • ありがとう数10

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

こんばんは。 テーブルのエンジンは? まさかMyISAMでやろうとしてるんじゃ・・・? トランザクションが使用できるエンジンを使わないと駄目です(InnoDBとか)。

その他の回答 (4)

回答No.5

クエリにトランザクション命令渡してないとかっていうことはありませんか? mysql_query("begin") mysql_query("rollback") mysql_query("commit") という感じで。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

うまくセッションが引き継がれてないのでは? 単発のSQLを実行すれば当然ロールバックもなにもなく オートコミットされると思いますが・・・ こんな感じでcccやdddがロールバックされないなら抜本的に 設定がおかしいと思いますが・・・ CREATE TABLE hoge(id int PRIMARY KEY NOT NULL AUTO_INCREMENT,data varchar(30)) TYPE=InnoDB; SET AUTOCOMMIT=0; BEGIN; INSERT INTO hoge(data)VALUES ('aaa'); INSERT INTO hoge(data)VALUES ('bbb'); COMMIT; BEGIN; INSERT INTO hoge(data)VALUES ('ccc'); INSERT INTO hoge(data)VALUES ('ddd'); ROLLBACK; BEGIN; INSERT INTO hoge(data)VALUES ('eee'); INSERT INTO hoge(data)VALUES ('fff'); COMMIT; SELECT * FROM hoge;

  • hardgeek
  • ベストアンサー率50% (7/14)
回答No.3

既に他の方が回答されていますが、MyISAMではロールバックができません。 そもそもMySQLにはストレージエンジンというものがあり、テーブルごとにストレージエンジンを指定することができるのですが、ストレージエンジンにはトランザクションに対応したものとそうでないものがあります。ロールバックが効かないということは、トランザクション非対応のストレージエンジンを利用されているのではないかと考えられます。 MySQLの代表的なストレージエンジンにはMyISAMとInnoDBがあり、前者がトランザクション非対応、後者はトランザクション対応です。恐らくMyISAMが使われているのでしょう。テーブルのストレージエンジンを確認するには、 mysql> SHOW CREATE TABLE テーブル名\G または mysql> SHOW TABLE STATUS; というコマンドを実行しましょう。ストレージエンジンを変更するには、 mysql> ALTER TABLE テーブル名 ENGINE=InnoDB; という具合にコマンドを実行してください。 ただし、ここで注意しなければいけないのは、ストレージエンジンを変更するということは、テーブルの性質が変わってしまうことを意味しますので、アプリケーション側の挙動を変更する必要が出てくるということです。もちろんあまり手を加えなくてもいい場合もありますが、トランザクション対応と非対応ではアプリケーション側の対応も変わります。詳しいことは参考URLを見てください。

参考URL:
http://nippondanji.blogspot.com/2009/02/myisaminnodb.html
drago_cyber
質問者

補足

MyISAMになっておりました。InnoDBに変更してみました。 ですが、やはりロールバックできません。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

バージョンとエンジンは?

drago_cyber
質問者

補足

失礼しました。 XAMPP 1.7.3の MySQL 5.1.41を使用しています。

関連するQ&A

  • トランザクションについて

    トランザクションについての質問なのですが、下にある1のSQLを実行すると 'a'だけ登録されるのは、分かるのですが、 2のSQLを実行すると、'c'と'd'の両方が登録されてしまいます。 私的には、両方登録されないのかなぁと思っていたのですが・・・ COMMITが来た時点で、START TRANSACTIONの開始位置は、 あまり関係ないということなのでしょうか? よろしくお願いします。 1. START TRANSACTION; insert into test values('a'); START TRANSACTION; insert into mtuser values('b'); ROLLBACK; COMMIT; 2. START TRANSACTION; insert into test values('c'); START TRANSACTION; insert into mtuser values('d'); COMMIT; ROLLBACK; 環境:Mysql4.1.19

    • ベストアンサー
    • MySQL
  • トランザクションについて教えてください

    PHPとMysqlを利用しています。MySQL4.1.18です。 同じテーブルに2つ以上の値をINSERTする場合、 1つでもエラーがあればロールバックさせるということはできますでしょうか。 あらかじめ「id=1」の値を登録しておき、この場合1つめがエラーになるので 2つめも実行されないでほしいのですが、実行されてしまいます。 テーブルのタイプはInnoDBにしています。 どうぞよろしくお願いします。 以下を参考に作成しました。 http://oshiete.nikkeibp.co.jp/qa3065237.html $sql = "begin"; $rst = mysql_query($sql, $con); //1つめ $sql= "INSERT INTO T_test(id,name)values('1','山田')"; $rst = mysql_query($sql, $con); if(!$rst){$err="err";} //2つめ $sql= "INSERT INTO T_test(id,name)values('2','鈴木')"; $rst = mysql_query($sql, $con); if(!$rst){$err="err";} $sql = "commit"; $rst = mysql_query($sql, $con); if($err){ $sql = "rollback"; $rst = mysql_query($sql, $con); }

    • ベストアンサー
    • MySQL
  • 副問い合わせのinsert文

    いつもお世話になっています。 insert文の副問い合わせのことでお聞きしたいのですが、 ■通常のinsert文 insert into AAA values(aaa,bbb,ccc); 上記のsqlを副問い合わせにした場合(aaaに別テーブルからの検索結果を入れたい場合)どういうSQL文になるでしょうか。 参考書等を参照すると、副問い合わせの場合はvaluesを省略する(使えない?)と記述がありました。 insert into AAA values ( aaa IN (SELECT bbb from BBB where ccc = ddd),bbb,ccc); とはできないみたいですので… どうかご教授宜しくお願いします。

  • SQLでできますか?

    SQLでできますか? INSERT INTO test (A) VALUES (B)というSQLを発行したいのですが、このSQLのVALUESのBにあたる部分を正規表現的に指定して、一度のクエリで以下のような結果を得たいのです。 1.テーブルhogeのpiyoカラムの値の先頭がappleになっている行を探す。 2.(1.)で抽出した行のidの値をBとする。 例えば、以下のようにです。 ■皆様が回答してくださるSQL文(1クエリで行いたい) ???????????? ■皆様が回答してくださるSQL文と同等の意味を持つSQL群 INSERT INTO test (A) VALUES (100) INSERT INTO test (A) VALUES (101) INSERT INTO test (A) VALUES (102) ■テーブルhoge _____id_____piyo__________created 1. 100 applebanana 2009/01/02 2. 101 apple_12345 2009/01/03 3. 102 appleXXXXXX 2009/01/04 4. 103 bananananan 2009/01/05 5. 104 ringogogogo 2009/01/06 分かりにくい説明ですが、お詳しい方、どうかご回答の程を宜しくお願いいたします。

    • ベストアンサー
    • MySQL
  • INSERT INTOに関しまして。

    $sql = "INSERT INTO テーブル名(name,day,kg)VALUES('','$day','-1')"; 現在このようなSQL文でINSERTしていますが、データベース内にあるカラムname全てに対してINSERTするにはどうすれば良いでしょうか??現在のSQL文ではそれができず、nameが空欄の状態で更新されてしまいます。

    • ベストアンサー
    • PHP
  • ロールバックできないステートメントについて

    こんばんは。 既存のテーブルのカラムを削除することになりまして、 以下の手順で変更をかけました。 環境:mysql_5.5 mysql>begin; mysql>alter table test_table drop column test_column; mysql>desc test_table; mysql>rollback; mysql>desc test_table; しかし、ロールバックをかけても元に戻らなかったのですが、 http://dev.mysql.com/doc/refman/5.1/ja/cannot-roll-back.htmlhttp://dev.mysql.com/doc/refman/5.1/ja/cannot-roll-back.html の記述にあるようにバージョン5.5でもalterでのロールバックは出来ないのでしょうか。 英語のサイトを見たのですが、ただしく訳せませんでした。 http://dev.mysql.com/doc/refman/5.5/en/implicit-commit.htmlhttp://dev.mysql.com/doc/refman/5.5/en/implicit-commit.html 回避方法があったら、教えてください。

  • PHP/MySQL INSERT文について。

    PHP/MySQL INSERT文について。 こんばんは。 PHP・MySQLでデータベースへデータの書き込みを試行錯誤しております。 そこで一つどうしても解決出来ない問題(謎)があるので質問させて頂きます。 簡易的な質問内容としては 全てのカラムに対する値の挿入は可能なのに カラムを指定して値を挿入しようとしたらエラーが出ます。 データベースの設定はテーブル名【TESTtable】 フィールド 種別 NULL 属性/その他 AAA int(6) No UNSIGNED ZEROFILL / auto_increment BBB int(4) Yes CCC int(4) Yes DDD int(4) Yes PHPでのSQL実行文をしてはの記述としては(値は全て可変で数値を代入します。) INSERT INTO TESTtable VALUES (last_insert_id(),50,600,50) とした場合は問題無くテーブルに書き込みされますが カラムを指定して INSERT INTO TESTtable (AAA,BBB,CCC,DDD) VALUES (last_insert_id(),50,600,50) とした場合、書き込みが行われません。 INSERT INTO TESTtable ('AAA','BBB','CCC','DDD') VALUES (last_insert_id(),50,600,50) INSERT INTO TESTtable (AAA,'BBB','CCC','DDD') VALUES (last_insert_id(),50,600,50) INSERT INTO TESTtable ('AAA','BBB','CCC','DDD') VALUES (last_insert_id(),'50','600','50') 等、色々試してみましたが不可能でした。 カラムAAAはauto_incrementにりますので毎回書き込みされますが BBB、CCC、DDDは書き込みが不要の場合もあるので カラム指定の書き込みは必須となるのですが・・・行き詰ってしまいました・・・。 ご教授頂ければ幸いです。 どうぞ、宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • Accessへ日付をINSERT

    今Access2000のテーブルから文字として受け取ったデータを 同じくAccessの別テーブルの日付型にINSERTしようとしています。 ソフトはVC6.0を使用しています。 受け取るSELECTはうまくできています。 UCHAR sqlstr [ ] ="INSERT INTO テーブル名"           "(カラム1、カラム2、カラム3)"           "VALUES(?,?,?)"; INSERTはこのようにSQL文を用意しておいてSQLExecuteで SQL文を実行しようとしています。 この場合にカラム1が日付型だとしたら、 「?」のパラメータには文字として渡し、 SQL文のなかで "VALUES(to_date(?,'YYYYMMDD'),?,?)"; とすればうまくいくと思ったのですができません。 いろいろサイトを見るとAccessでは「’」ではなく「#」を使うと 書いてあったので to_date(?,#YYYYMMDD#) とやったのですがエラーになってしまいます。 ちなみにパラメータとして渡す文字列は「20020413」という 8桁の普通の文字です。 どなたか知っている方いませんでしょうか? 他に方法があればそれでも構いません。 どうか教えてください。m(__)m どうしても先へ進めません…。

  • A5:SQL Mk-2でテーブルは作れないのか?

    xamppとA5:SQL Mk-2ソフトを組み合わせてます。 phpmyadminでデータベースとテーブルを作ってMk-2でsql文 例としてselecto * from aaa;などは動きます。 しかしMk-2で CREATE TABLE shiire(scode CHAR(4),kosuu INT,sdate CHAR(7)); INSERT INTO shiire VALUES ('A002',35,'2003-04'); INSERT INTO shiire VALUES ('B002',24,'2003-05'); は作れません。phpmyadminのクエリでは作れます。 ご教授ください。

    • ベストアンサー
    • MySQL
  • トランザクションとテーブルロック

    初心者の質問で申し訳ありません。 トランザクションで複数のテーブルを更新する時、テーブルロックはかかっているのでしょうか。 具体的に言うと、 BEGIN TRAN a  INSERT INTO A VALUES('data1')  INSERT INTO B VALUES('data1','data2')  INSERT INTO C VALUES('data1','data2','data3') COMMIT TRAN a とするとき、テーブルA,B,Cはあらかじめロックしておく必要があるのでしょうか。 アドバイスお願いいたします。