dポイントプレゼントキャンペーン実施中!

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

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

A 回答 (5件)

こんばんは。



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

クエリにトランザクション命令渡してないとかっていうことはありませんか?


mysql_query("begin")
mysql_query("rollback")
mysql_query("commit")
という感じで。
    • good
    • 0

うまくセッションが引き継がれてないのでは?


単発の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;
    • good
    • 0

既に他の方が回答されていますが、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/myisamin …

この回答への補足

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

補足日時:2010/07/29 23:59
    • good
    • 1

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

この回答への補足

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

補足日時:2010/07/29 19:59
    • good
    • 0

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