MySQL存储过程 事务transaction
MySQL 中,单个 Store Procedure(SP) 不是原子操作,而 Oracle 则是原子的。如下的存储过程,即使语句2 失败,语句 1 仍然会被 commit 到数据库中:
- create table testproc(id int(4) primary key, name varchar(100));
- CREATE PROCEDURE test_proc_ins(
- IN i_id INT,
- IN i_name VARCHAR(100)
- )
- BEGIN
- INSERT INTO testproc VALUES (i_id, i_name); -- 语句1
- INSERT INTO testproc VALUES (i_id, i_name); -- 语句2(因为id为PK,此语句将出错)。
- END;
要使整个存储过程成为一个原子操作的办法是:在存储过程主体开始部分,指定开始一个事务。语句 2 失败,语句 1 不会被 commit 到数据库中,存储过程将会在调用时抛出一个异常。
- CREATE PROCEDURE test_proc_ins(
- IN i_id INT,
- IN i_name VARCHAR(100)
- )
- BEGIN
- start transaction; --整个存储过程指定为一个事务
- INSERT INTO testproc VALUES (i_id, i_name);
- INSERT INTO testproc VALUES (i_id+1, i_name); -- 这里把id+1,避免主键冲突
- commit; -- 语句1。必须主动提交
- END;
- CREATE PROCEDURE test_proc_ins(
- IN i_id INT,
- IN i_name VARCHAR(100),
- OUT o_ret INT)
- BEGIN
- start transaction;
- INSERT INTO testproc VALUES (i_id, i_name);
- INSERT INTO testproc VALUES (i_id+1,i_name);
- commit; -- 语句1,提交后,事务已结束
- set o_ret = 1;
- start transaction; -- 再启一个事务
- INSERT INTO testproc VALUES (i_id+2,i_name); -- 语句2
- INSERT INTO testproc VALUES (i_id+2,i_name); -- 语句3
- set o_ret = 2;
- commit; -- 数据正常的情况下,需要再次commit以结束事务
- END;
MySQL的回滚事物的操作
在处理事务时,使用SQLException捕获SQL错误,然后处理; 按照这个推论,我们必须在MySQL存储过程中捕获SQL错误,最后判断是回滚(ROLLBACK)还是提交(COMMIT)。
- 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;
- select t_error; //返回标识位的结果集;
- 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的更多相关文章
- [MySQL] MySQL存储过程 事务transaction 数据表重建
直接上代码 -- 删除存储过程 DROP PROCEDURE IF EXISTS `renew_message_queue`; -- 添加; 的转义 DELIMITER ;; CREATE PROCE ...
- mysql 存储过程 事务; mysql的事务中包含一个存储过程
在asp.net结合mysql的开发中,我平时用到的事务处理是 使用 TransactionOptions 来进行处理 TransactionOptions transactionOption = ...
- mysql 存储过程事务
DECLARE t_error INTEGER DEFAULT ; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=; START TRAN ...
- mysql存储过程事务
之前在写一个存储过程的时候由于不仔细导致数据库锁死,这里反省一下. 存储过程是这样的:把数据按顺序插入三张表,如果其中任何一处出错,就把前面已经做了的操作进行回滚,存储过程里面是用事务实现的,我是这么 ...
- MYSQL存储过程事务列子
CREATE DEFINER=`root`@`localhost` PROCEDURE `createBusiness`(parameter1 int) BEGIN #Routine body goe ...
- mysql 存储过程事务支持回滚
如图查看表的属性: InnoDB 支持事务. MyISAM 不支持事务,不过性能更优越.
- MySQL存储过程之事务管理
原文链接:http://hideto.iteye.com/blog/195275 MySQL存储过程之事务管理 ACID:Atomic.Consistent.Isolated.Durable 存储程序 ...
- mysql存储过程之事务篇
mysql存储过程之事务篇 事务的四大特征: ACID:Atomic(原子性).Consistent(一致性).Isolated(独立性).Durable (持久性) MySQL的事务支持不是绑定在M ...
- Mysql存储过程包括事务,且传入sql数据运行
有这样一个需求.要求在mysql存储过程中使用到事务,并且运行的是动态的sql语句 代码例如以下: BEGIN DECLARE in_data TEXT; /** 标记是否出错 */ DECLARE ...
随机推荐
- 编写一个函数实现n^k,使用递归实现
思路:例如2的3次方.可以分解为2乘2的2次方,而2的2次方又可以分解为2乘2的以此方法,以此类推. #include<stdio.h> int Find_num(int n,int k) ...
- IP地址转换函数
只适用于IPV4 inet_addr函数将用点分十进制字符串表示的IPv4地址转化为用网络字节序整数表示的IPv4地址. 失败时返回INADDR_NONE. inet_aton函数完成和inet_ad ...
- ubuntu 16.04卸载不必要的默认安装软件
两个办法,一个在ubuntu软件里一个一个删,明显的windows下做法. 还有一个通过终端来删除.ctrl+alt+t打开终端. 1.卸载libreoffices(要删一起删了,然后去装office ...
- How to implement a windbg plugin
How to implement a windbg plugin Define EXT_CLASS #include "lauxlib.h" class EXT_CLASS : p ...
- 使用cmake编译luabind
编写了一下cmakelists.txt文件 根目录 cmake_minimum_required(VERSION 2.8)project (Test) add_definitions( "/ ...
- redis 学习资料
redis 学习资料 网址 Redis 教程(菜鸟教程) http://www.runoob.com/redis/redis-tutorial.html Redis 命令参考 http://redis ...
- centos7使用163 yum源
一般是下载 .repo 源即可,但有时候我们需要安装一些额外的包,就需要下载 Extra Packages for Enterprise Linux (EPEL) 源, 比如我们需要用 yum 安装 ...
- redis常用客户端命令
sentinel操作: 1.查询主节点:redis-cli -h 172.16.4.220 -p 46379 SENTINEL get-master-addr-by-name mymaster 2.查 ...
- 黄聪:Pjax 无刷新开发web,更好用户体验
什么Ajax.Pjax.Njax...神马玩意? 有Njax吗? 木有...不过真有Pjax!! 其实pjax就是用到了html5的新history api: pushState和replaceSta ...
- Unity单例
引自:http://www.unitymanual.com/thread-16916-1-1.html