查看: 578|回复: 0

关于mysql procedure 事务处理的一点小技巧

 关闭 [复制链接]

签到天数: 2624 天

连续签到: 3 天

[LV.Master]至尊海神IIIIII

发表于 2010-10-27 19:14 |广东| 显示全部楼层 |阅读模式
关于mysql procedure 事务处理的一点小技巧



mysql存储过程没提供UNDO的handler,处理上一般都用其他方法替代了,下面写出测试环境及方法

表:
CREATE TABLE `a` (
  `a` int(11) NOT NULL AUTO_INCREMENT,
  `b` int(11) DEFAULT NULL,
  PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1

过程:
CREATE DEFINER=`root`@`127.0.0.1` PROCEDURE `test1`()
BEGIN
declare err INT default 0;
declare continue handler for sqlexception set err=1;
start transaction;
insert a values(1,1);
insert a values(1,1);
insert a values(2,2);
if (err=0) then
  commit;
  select 'OK';
else
  rollback;
  select 'err';
end if;
END
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: latin1_swedish_ci

执行结果:
root@localhost(test) 11:54:12>call test1();
+-----+
| err |
+-----+
| err |
+-----+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
root@localhost(test) 11:54:14>select * from a;
Empty set (0.00 sec)

完整的事务处理,如果有一个不OK则都回滚

PCOS系统下载站:http://zhuangji.wang

本版积分规则