mysqlでストアドプロシージャ その4 - トランザクション
2012/09/23
mysql
sql
ストアド
トランザクション
mysqlでストアドプロシージャ その4 です。
トランザクションの実験です。
どうもDBのエンジンによってトランザクションが有効無効がある感じですね。
参考
というわけで、データベースエンジンを切り替えて確認してみました。
どんな実験したかというと、INSERT文を二回流して、2回目のINSERTは1回目にINSERTとしたPKを使ってかならず失敗させます。
トランザクションが効けば、1回目のINSERTも登録されないはずというわけです。
たしかにMyISAMで、はトランザクションが効かず、InnoDBでは効きました。
テーブルは以下
create table a (エンジンの変更は、以下のSQLで行います。
id smallint unsigned not null auto_increment primary key,
tday timestamp
);
ALTER TABLE a engine = InnoDB;
ALTER TABLE a engine = MyISAM;
以下ストアド
DROP PROCEDURE IF EXISTS p006;
delimiter //
CREATE PROCEDURE p006()
BEGIN
DECLARE x INT;
-- 以下の実験コードは、データベースエンジンがInnoDBとき確認できます。
-- MyISAMだとロールバックされない。
-- エラーの場合 ロールバック設定
DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;
-- トランザクション開始
START TRANSACTION;
INSERT INTO a VALUES(0, CURRENT_TIMESTAMP());
-- PKの重複がおこるので、かならず失敗するのでロールバックされるはず
INSERT INTO a SET id = last_insert_id();
-- お決まりのコミット!!
COMMIT;
END
//
CALL p006();-- ここで実行
DROP PROCEDURE IF EXISTS p006;
delimiter //
CREATE PROCEDURE p006()
BEGIN
DECLARE x INT;
-- 以下の実験コードは、データベースエンジンがInnoDBとき確認できます。
-- MyISAMだとロールバックされない。
-- エラーの場合 ロールバック設定
DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;
-- トランザクション開始
START TRANSACTION;
INSERT INTO a VALUES(0, CURRENT_TIMESTAMP());
-- PKの重複がおこるので、かならず失敗するのでロールバックされるはず
INSERT INTO a SET id = last_insert_id();
-- お決まりのコミット!!
COMMIT;
END
//
CALL p006();-- ここで実行
DROP PROCEDURE IF EXISTS p006;
: