MySQL 中,单个 Store Procedure(SP) 不是原子操作,而 Oracle 则是原子的。如下的存储过程,即使语句2 失败,语句 1 仍然会被 commit 到数据库中:

  1. create table testproc(id int(4) primary key, name varchar(100));
  2. CREATE PROCEDURE test_proc_ins(
  3. IN i_id INT,
  4. IN i_name VARCHAR(100)
  5. )
  6. BEGIN
  7. INSERT INTO testproc VALUES (i_id, i_name);  -- 语句1
  8. INSERT INTO testproc VALUES (i_id, i_name);  -- 语句2(因为id为PK,此语句将出错)。
  9. END;

要使整个存储过程成为一个原子操作的办法是:在存储过程主体开始部分,指定开始一个事务。语句 2 失败,语句 1 不会被 commit 到数据库中,存储过程将会在调用时抛出一个异常。

  1. CREATE PROCEDURE test_proc_ins(
  2. IN i_id INT,
  3. IN i_name VARCHAR(100)
  4. )
  5. BEGIN
  6. start transaction; --整个存储过程指定为一个事务
  7. INSERT INTO testproc VALUES (i_id, i_name);
  8. INSERT INTO testproc VALUES (i_id+1, i_name); -- 这里把id+1,避免主键冲突
  9. commit; -- 语句1。必须主动提交
  10. END;
  1. CREATE PROCEDURE test_proc_ins(
  2. IN i_id INT,
  3. IN i_name VARCHAR(100),
  4. OUT o_ret INT)
  5. BEGIN
  6. start transaction;
  7. INSERT INTO testproc VALUES (i_id, i_name);
  8. INSERT INTO testproc VALUES (i_id+1,i_name);
  9. commit; -- 语句1,提交后,事务已结束
  10. set o_ret = 1;
  11. start transaction; -- 再启一个事务
  12. INSERT INTO testproc VALUES (i_id+2,i_name); -- 语句2
  13. INSERT INTO testproc VALUES (i_id+2,i_name); -- 语句3
  14. set o_ret = 2;
  15. commit; -- 数据正常的情况下,需要再次commit以结束事务
  16. END;

MySQL的回滚事物的操作

在处理事务时,使用SQLException捕获SQL错误,然后处理; 按照这个推论,我们必须在MySQL存储过程中捕获SQL错误,最后判断是回滚(ROLLBACK)还是提交(COMMIT)。

  1. DROP PROCEDURE IF EXISTS  test_sp1
  2. CREATE PROCEDURE test_sp1( )
  3. BEGIN
  4. DECLARE t_error INTEGER DEFAULT 0;
  5. DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1;
  6. START TRANSACTION;
  7. INSERT INTO test VALUES(NULL, 'test sql 001');
  8. INSERT INTO test VALUES('1', 'test sql 002');
  9. IF t_error = 1 THEN
  10. ROLLBACK;
  11. ELSE
  12. COMMIT;
  13. END IF;
  14. select t_error;   //返回标识位的结果集;
  15. END


mysql事物处理实例

MYSQL的事务处理主要有两种方法
1.用begin,rollback,commit来实现
    begin开始一个事务
    rollback事务回滚
    commit 事务确认
2.直接用set来改变mysql的自动提交模式
    mysql默认是自动提交的,也就是你提交一个query,就直接执行!可以通过
    set autocommit = 0 禁止自动提交
    set autocommit = 1 开启自动提交
    来实现事务的处理。
但要注意当用set autocommit = 0 的时候,你以后所有的sql都将作为事务处理,直到你用commit确认或 rollback结束,注意当你结束这个事务的同时也开启了新的事务!按第一种方法只将当前的做为一个事务!
MYSQL只有 INNODB和BDB类型的数据表才支持事务处理,其他的类型是不支持的!

MySQL存储过程 事务transaction的更多相关文章

  1. [MySQL] MySQL存储过程 事务transaction 数据表重建

    直接上代码 -- 删除存储过程 DROP PROCEDURE IF EXISTS `renew_message_queue`; -- 添加; 的转义 DELIMITER ;; CREATE PROCE ...

  2. mysql 存储过程 事务; mysql的事务中包含一个存储过程

    在asp.net结合mysql的开发中,我平时用到的事务处理是 使用 TransactionOptions  来进行处理 TransactionOptions transactionOption = ...

  3. mysql 存储过程事务

    DECLARE t_error INTEGER DEFAULT ; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=; START TRAN ...

  4. mysql存储过程事务

    之前在写一个存储过程的时候由于不仔细导致数据库锁死,这里反省一下. 存储过程是这样的:把数据按顺序插入三张表,如果其中任何一处出错,就把前面已经做了的操作进行回滚,存储过程里面是用事务实现的,我是这么 ...

  5. MYSQL存储过程事务列子

    CREATE DEFINER=`root`@`localhost` PROCEDURE `createBusiness`(parameter1 int) BEGIN #Routine body goe ...

  6. mysql 存储过程事务支持回滚

    如图查看表的属性: InnoDB 支持事务. MyISAM 不支持事务,不过性能更优越.

  7. MySQL存储过程之事务管理

    原文链接:http://hideto.iteye.com/blog/195275 MySQL存储过程之事务管理 ACID:Atomic.Consistent.Isolated.Durable 存储程序 ...

  8. mysql存储过程之事务篇

    mysql存储过程之事务篇 事务的四大特征: ACID:Atomic(原子性).Consistent(一致性).Isolated(独立性).Durable (持久性) MySQL的事务支持不是绑定在M ...

  9. Mysql存储过程包括事务,且传入sql数据运行

    有这样一个需求.要求在mysql存储过程中使用到事务,并且运行的是动态的sql语句 代码例如以下: BEGIN DECLARE in_data TEXT; /** 标记是否出错 */ DECLARE ...

随机推荐

  1. [Hi3520DV200]烧录

    setenv ipaddr 192.168.1.11 setenv serverip 192.168.1.139 setenv gatewayip 192.168.1.1 mw.b ff ;sf pr ...

  2. AD10 没有原理图是否可以修改 PCB

    AD10 没有原理图是否可以修改 PCB 有朋友问 AD 是否可以在没有原理的情况下修改 PCB 呢? 答案是肯定的,可以. 比如增加元件和网络,可以先增加元件封装,再打开网络管理给焊盘加上网络. 相 ...

  3. Webpack 的 Tree Shaking

    为什么要使用 Tree Shaking? 当从某文件模块中导出(某一个或几个变量.函数.对象等),然而这个文件模块还有许多其它(我们这次并不需要)的导出,webpack会不管三七二十一简单粗暴的将整个 ...

  4. git忽略已提交的文件或目录

    项目中的某个文件或目录已经被commit,并push到远程服务器server了. 这时发现要忽略该文件或目录,在.gitignore文件里面添加规则已经不起作用了.因为.gitignore只对从来没有 ...

  5. HttpServletResponse和HttpServletRequest

    1.相关的接口   HttpServletRequest HttpServletRequest接口最常用的方法就是获得请求中的参数,这些参数一般是客户端表单中的数据.同时,HttpServletReq ...

  6. 配置中心Client端

    配置中心Client端 1.在Order工程中的Order-Server模块的pom.xml中增加 <dependency> <groupId>org.springframew ...

  7. Eclipse安装插件的“最好方法”:dropins文件夹的妙用

    在Eclipse3.4以前安装插件非常繁琐. 在Eclipse3.5以后插件安装的功能做了改进.而且非常方便易用. 我们只需要把需要的插件复制(拖放)到eclipse\dropins,然后插件就安装成 ...

  8. Sql语句的优化摘要

    1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉 ...

  9. shopnc-setNcCookie-后台验证码

    function setNcCookie($name, $value, $expire='3600', $path='', $domain='.a.cn', $secure=false){ if (e ...

  10. msp430学习笔记-实现开方log等计算及FFT算法(待续)

    MSP430 FFT算法实现 http://bbs.21ic.com/icview-391532-1-1.html http://blog.sina.com.cn/s/blog_6cd2030b010 ...