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. Python __name__变量

    原文: http://blog.csdn.net/u011511601/article/details/53504355 Python使用缩进对齐组织代码的执行,所有没有缩进的代码,都会在载入时自动执 ...

  2. Shell 一键安装命令

    现在是懒人的天下,为了迎合用户的需求,很多开源软件或者包提供的安装步骤都非常简单,大家应该看到不少类似一键安装的命令.下面是几个典型的例子: # homebrew 安装 $ ruby -e " ...

  3. Elastic Story(一)

    关于_all 当索引一个文档的时候,Elasticsearch 取出所有字段的值拼接成一个大的字符串,作为 _all 字段进行索引.例如,当索引这个文档时: { "tweet": ...

  4. jdk源码剖析三:锁Synchronized

    一.Synchronized作用 (1)确保线程互斥的访问同步代码 (2)保证共享变量的修改能够及时可见 (3)有效解决重排序问题.(Synchronized同步中的代码JVM不会轻易优化重排序) 二 ...

  5. golang bug Unknown load command 0x32 (50)

    问题 编译文件时报错: /usr/local/go/pkg/tool/darwin_amd64/link: /usr/local/go/pkg/tool/darwin_amd64/link: comb ...

  6. golang gorilla websocket例子

    WebSocket协议是基于TCP的一种新的网络协议.它实现了浏览器与服务器全双工(full-duplex)通信--允许服务器主动发送信息给客户端. WebSocket通信协议于2011年被IETF定 ...

  7. app崩溃后自动重启

    android 引用:http://blog.csdn.net/caiwenfeng_for_23/article/details/41184353 package com.tan.abnormalr ...

  8. Ribbon 常用配置

    配置参数 默认值 说明 <client>.<namespace>.listOfServers 配置服务器列表 <client>.<namespace>. ...

  9. Spring Boot基础知识

    Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成为一名 Spring Boot 的专家. 问题一 Spring Boot.Spring MVC 和 Spring 有什么区别 ...

  10. DLL的晚绑定与早绑定

    调用DLL中的函数可分为早绑定与晚绑定! 早绑定是指在编译期就已经确定函数地址! 晚绑定是指在运行期动态加载dll,并根据查表的方式获取dll内exports函数的地址,由于早绑定比较简单,在此不再讲 ...