1

mysqlでトランザクションをテストするためのストアドプロシージャを作成するだけです。

しかし、どういうわけかそれは機能していません。

これが私のコードです:

USE `test`;
DROP procedure IF EXISTS `testTran`;
DELIMITER $$
USE `test`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `testTran`()
BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION rollback;
    START TRANSACTION;
    INSERT INTO `test`.`books`(`name`,`number`) VALUES ('asd', 20);
    ALTER TABLE `test`.`books` ADD COLUMN `name` VARCHAR(45) NULL  AFTER `number` ;
    COMMIT;
END$$
DELIMITER ;

トランザクション内で、2番目のコマンドは失敗するexist列を作成することです。私が期待しているのは、最初の挿入がロールバックになることです。しかし実際にはそうではありません。インサートは機能します。

誰か助けてもらえますか?

4

2 に答える 2

1

トランザクションを使用するには、テーブルをInnoDBのようなトランザクションテーブルに変換する必要があります。

オプションで、SAVEPOINTを使用してストアドプロシージャによって行われた変更をロールバックできます。

DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK TO identifier;

SAVEPOINT identifier;

START TRANSACTION;

INSERT INTO `test`.`books`(`name`,`number`) VALUES ('asd', 20);
ALTER TABLE `test`.`books` ADD COLUMN `name` VARCHAR(45) NULL  AFTER `number` ;

COMMIT;
于 2012-09-26T04:48:49.640 に答える
0

ALTER TABLE ステートメントは、実行前に暗黙の COMMITを引き起こします。

于 2014-01-08T13:58:21.150 に答える