来自开发人员的问题“
一个大事务 (估计是存储过程),上半部分是update语句
下半部分要利用上面的埂新的数据oralce可以做到,  问mysql支持这个功能马?

解决方案 »

  1.   

    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; 提示是失败的 
      

  2.   

    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
      

  3.   

    我的存储过程如下 编译通过
    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
    但是现在发现 数据不对 (不知道什么原因??)
      

  4.   

    建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
       参考一下这个贴子的提问方式http://forum.csdn.net/BList/OtherDatabase
       
       1. 你的 create table xxx .. 语句
       2. 你的 insert into xxx ... 语句
       3. 结果是什么样,(并给以简单的算法描述)
       
       这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试。   
      

  5.   


    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;
      

  6.   

    这个问题很可能无解
    涉及到mysql不支持事务的这种共能  (mysql upate是更新锁 支持在未提交前看到修改数据)
    但仅仅是看到
    他不支持再利用的功能(比如我的存储过程下半部分
    ---这个name之前是未提交的
    select a into temp  from a where a='name'; 
    这里temp是可以看到值  用select temp 可以看到值的 
    insert into aa values(temp); --到这里一直不通过从数据显示来看是失败的额
      

  7.   

    建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
       参考一下这个贴子的提问方式http://forum.csdn.net/BList/OtherDatabase
       
       1. 你的 create table xxx .. 语句
       2. 你的 insert into xxx ... 语句
       3. 结果是什么样,(并给以简单的算法描述)

       
       这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试。   
      

  8.   

    不知道mysql事务是否隔离级别(类似mssql的额)
    如果能做  分2次提交 或者多次提交  能够解决吗 
      

  9.   

    表结构在上面啦
    存储过程在上面
    测试数据就一条 a表 insert into a values('1');   b表为空表目标:
    当call a()之后
    aa表里有一条新纪录
      

  10.   

    这个存储在oacle跑是没有问题的
    但是mysql事务不支持这种写法 (只是感觉俄到 但无法精确描述成因)  问题是如何利用隔离级别来解决?
      

  11.   

    触发器不支持事务 实际上我是把问题进行了简化
    (原始的第1个操作是update全表, 之后从这个埂新后的表里取数据)
    事务可以保证操作的安全性
      

  12.   

    能够从理论上找原因说明不成功的道理么 (oracle为什么就可以)
      

  13.   

    放在java里作  (不能用存储过程)
    jdbc有缓存支持这种写法不知道temp表能否做到
      

  14.   

    看得一头雾水。
    MYSQL/INNODB是支持事务,你的要求是可以作到的。
    之所以不成功,有另外的原因。