create procedure sp as set autocommit = 0; start transaction; update product set name = _name where id = _id; update product set code =_name where id=_id; commit; 提示是失败的
main:BEGIN DECLARE exit HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUND ROLLBACK; declare i int; set i = 0; START TRANSACTION; INSERT INTO file_table(name,type,location) VALUE(i_name,i_type,i_location); SAVEPOINT my_sa; set i = 1; --@1--- INSERT INTO log_table(LOGNAME, LOGMSG,USERID,LOGDATE) VALUES('ff',null,i_userid,NOW()); set i = 2; if i = 2 then commit; else if i = 1 then rollback to savepoint my_sa; release savepoint my_sa; else ROLLBACK; end if; END main
我的存储过程如下 编译通过 BEGIN declare temp char(20); DECLARE exit HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUND ROLLBACK;START TRANSACTION;update a set a = 'name' where a = 1; select a into temp from a where a='name'; insert into aa values(temp); END 但是现在发现 数据不对 (不知道什么原因??)
CREATE TABLE `a` ( `a` varchar(20) default NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1; CREATE TABLE `aa` ( `a` int(11) NOT NULL auto_increment, PRIMARY KEY (`a`) ) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8; -- Procedure "a" DDLCREATE DEFINER=`betbrain`@`%` PROCEDURE `a`() BEGINdeclare temp char(20);DECLARE exit HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUND ROLLBACK;START TRANSACTION;update a set a = 'name' where a = 1;select a into temp from a where a='name';insert into aa values(temp);select a from aa;select a from a;commit; END;
这个问题很可能无解 涉及到mysql不支持事务的这种共能 (mysql upate是更新锁 支持在未提交前看到修改数据) 但仅仅是看到 他不支持再利用的功能(比如我的存储过程下半部分 ---这个name之前是未提交的 select a into temp from a where a='name'; 这里temp是可以看到值 用select temp 可以看到值的 insert into aa values(temp); --到这里一直不通过从数据显示来看是失败的额 )
as
set autocommit = 0;
start transaction;
update product set name = _name where id = _id;
update product set code =_name where id=_id;
commit; 提示是失败的
BEGIN
declare temp char(20);
DECLARE exit HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUND ROLLBACK;START TRANSACTION;update a set a = 'name' where a = 1;
select a into temp from a where a='name';
insert into aa values(temp); END
但是现在发现 数据不对 (不知道什么原因??)
参考一下这个贴子的提问方式http://forum.csdn.net/BList/OtherDatabase
1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试。
CREATE TABLE `a` (
`a` varchar(20) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `aa` (
`a` int(11) NOT NULL auto_increment,
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;
-- Procedure "a" DDLCREATE DEFINER=`betbrain`@`%` PROCEDURE `a`()
BEGINdeclare temp char(20);DECLARE exit HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUND ROLLBACK;START TRANSACTION;update a set a = 'name' where a = 1;select a into temp from a where a='name';insert into aa values(temp);select a from aa;select a from a;commit; END;
涉及到mysql不支持事务的这种共能 (mysql upate是更新锁 支持在未提交前看到修改数据)
但仅仅是看到
他不支持再利用的功能(比如我的存储过程下半部分
---这个name之前是未提交的
select a into temp from a where a='name';
这里temp是可以看到值 用select temp 可以看到值的
insert into aa values(temp); --到这里一直不通过从数据显示来看是失败的额
)
参考一下这个贴子的提问方式http://forum.csdn.net/BList/OtherDatabase
1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试。
如果能做 分2次提交 或者多次提交 能够解决吗
存储过程在上面
测试数据就一条 a表 insert into a values('1'); b表为空表目标:
当call a()之后
aa表里有一条新纪录
但是mysql事务不支持这种写法 (只是感觉俄到 但无法精确描述成因) 问题是如何利用隔离级别来解决?
(原始的第1个操作是update全表, 之后从这个埂新后的表里取数据)
事务可以保证操作的安全性
jdbc有缓存支持这种写法不知道temp表能否做到
MYSQL/INNODB是支持事务,你的要求是可以作到的。
之所以不成功,有另外的原因。