我想写一个mysql事务,如果query执行异常则回滚,否则提交,但是搜了半天都是在存储过程中实现的,怎么不写存储过程实现这个功能呢,存储过程的代码大致都是这样的:
 DELIMITER $$  
DROP PROCEDURE IF EXISTS  test_sp1 $$  
CREATE PROCEDURE test_sp1( )  
    BEGIN  
    DECLARE t_error INTEGER DEFAULT 0;  
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1;  
  
        START TRANSACTION;  
            INSERT INTO test VALUES(NULL, 'test sql 001');     
            INSERT INTO test VALUES('1', 'test sql 002');     
  
        IF t_error = 1 THEN  
            ROLLBACK;  
        ELSE  
            COMMIT;  
        END IF;  
  
    END$$  
DELIMITER ;  
怎么写直接开启一个事务,然后判断异常。如果事务非得在存储过程中写,那也太不灵活了吧,刚看mysql,不懂,望大神指导

解决方案 »

  1.   

    如果感觉异常在存储过程中比较麻烦,可以定义成有返回值的存储过程,在程序中判断即可,例如:
    CREATE  
    PROCEDURE  ps_ddgl_ggwxx_insert(IN ps_sblxid INT(11), IN ps_sblxmc VARCHAR(20)  CHARACTER SET UTF8, IN ps_ggwzbh VARCHAR(20) CHARACTER SET UTF8, IN ps_ggwzmc VARCHAR(20) CHARACTER SET UTF8, IN ps_bzxx VARCHAR(20) CHARACTER SET UTF8, OUT exceResult INT)
      COMMENT '新增广告位'
    BEGIN
      START TRANSACTION;
      select  count(*) into @likeset   from   ddgl_ggwxx  where   ggwzbh = ps_ggwzbh  ;
      select  count(*) into @totals   from   ddgl_ggwxx  where   sblxid = ps_sblxid  ;
      select   ggwsx into @ggwsx   from   ddgl_sblx  where  lx_id  = ps_sblxid  ;
       IF(@totals >= @ggwsx) then
        SET exceResult = 3;
      ELSEIF(@likeset >0) then
       SET exceResult = 2;
     else
    INSERT INTO ddgl_ggwxx ( sblxid, sblxmc, ggwzbh, ggwzmc, bzxx) VALUES(ps_sblxid, ps_sblxmc, ps_ggwzbh, ps_ggwzmc, ps_bzxx);
      COMMIT;
      SET exceResult = 1;
    end if  ;
    END
      

  2.   

    还是非得写存储过程对吗,我现在就想摆脱存储过程,直接执行sql语句,像mssql那样,可直接在sql语句中判断异常,不必写存储过程
      

  3.   

    不在存储过程写也可以啊, 把你的流程写在你的应用程序中。不要用declare 就可以了
    由你的应用程序来判断每条语句的执行结果, 错误就发语句rollback
      

  4.   

    还是非得写存储过程对吗,我现在就想摆脱存储过程,直接执行sql语句,像mssql那样,可直接在sql语句中判断异常,不必写存储过程 
      

  5.   

    不用程序控制,直接在sql语句中判断,就像mssql类似,有没有这种可能呢
      

  6.   

    在程序中捕获异常或 直接执行查询SQL语句,对得到的结果判定即可 
      

  7.   

    不用程序控制,直接在sql语句中判断,就像mssql类似,有没有这种可能呢set @a=1;
    select @a:=count(0) from table1;
    if @a>0
    ...
    else
    ...
    end if; 
      

  8.   

    MYSQL不支持匿名块,不用想了
      

  9.   

    很简单
    楼主说的是匿名块mssql和plsql都支持mysql是没有这种的,mysql必须通过命名块,也就是存储过程来执行