- 论坛徽章:
- 1
|
一直用POSTGRESQL,事务处理非常好,从没出现过问题。
今天玩了下MYSQL,版本5.6,测试事务处理时候,发现MYSQL有个好大的坑呀!
先上代码:
CREATE DEFINER=`root`@`localhost` PROCEDURE `po_instk`()
BEGIN
declare exit handler for sqlexception rollback;
start transaction;
/*定义数据表:INSTK1*/
drop table if exists instk1;
create table instk1(
doc_no varchar(30) ,
tran_type varchar(10),
CONSTRAINT pk_instk1 PRIMARY KEY (doc_no));
insert into instk1 (doc_no,tran_type) values('INV-001','PO-IN');
/*定义数据表:INSTK2*/
drop table if exists instk2;
create table instk2(
doc_no varchar(30) ,
part_no varchar(30),
loc varchar(10),
qty decimal(12,2),
price decimal(12,2),
CONSTRAINT pk_instk2 PRIMARY KEY (doc_no,part_no,loc));
insert into instk2(doc_no,part_no,loc,qty,price) values('INV-001','A-001','CK01',10,1010);
insert into instk2(doc_no,part_no,loc,qty,price) values('INV-001','A-001','CK01',10,1010); /*此处故意与前一行重复*/
insert into instk2(doc_no,part_no,loc,qty,price) values('INV-001','A-002','CK01',10,21000);
insert into instk2(doc_no,part_no,loc,qty,price) values('INV-001','A-003','CK01',10,220);
commit;
END
数据表INSTK2的前二行故意重复,违反主键约束,观察是否能回滚?
执行时候,发现事务ROLLBACK回滚死活都无效,总是能插入数据到表里去。
以为代码错误,把该段代码拷贝到POSTGRESQL里,稍微修改,结果POSTGRESQL拒绝提交,成功回滚,证明程序正确。
折腾了大半天,一直无法正确回滚,后来换个方法:不在存储过程里建表,先把表建好,只在里提交数据,结果发现,竟然可以成功回滚!
也就是说,如果事务处理时候里,包含DDL操作,比如建表命令,比如:CREATE TABLE ......, POSTGRESQL事务处理则会出现问题,无法正常执行。
如果只有数据操作DML命令,比如INSERT ,UPDATE,DELETE才能成功执行。
在POSTGRESQL里,无论是否包含DML还是DDL命令,不论是临时表还是正式表,其提交和回滚均可以正常进行,
事务处理明显比MYSQL严谨,没有这样的大水坑。
|
|