mysql 存储过程 事务; mysql的事务中包含一个存储过程
在asp.net结合mysql的开发中,我平时用到的事务处理是 使用 TransactionOptions 来进行处理
- TransactionOptions transactionOption = new TransactionOptions
- {
- IsolationLevel = IsolationLevel.ReadCommitted, //设置事务隔离级别
- Timeout = new TimeSpan(0, 5, 10) // 设置事务超时时间为5分10秒
- };
- using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, transactionOption))
- {
- try
- {
- string temp = jkController.Changepoint(mobile, actionType, actionId, point);
- if (temp == "already_login")
- {
- throw new MessageJxtException(Message.一天只能获取一次登陆积分);
- }
- else if (temp == "already_vote")
- {
- throw new MessageJxtException(Message.一个投票只能获取一次投票积分);
- }
- else
- {
- outPoint = Convert.ToInt32(temp);
- }
- scope.Complete(); //提交事务
- }
- catch (Exception ex)
- {
- throw new MessageJxtException(Message.操作失败本次操作没有执行);
- }
- }
这样写了之后,mysql的存储过程里面不需要做特殊处理,你写2个sql语句,任意一个报错,都会在asp.net里面被回滚的(准确的说,是如果没有报错的话,就会和自行到scope.Complete()来执行提交,否则,就不会提交,也就达到了事务)
但是现在有另外一个客户端是php来编写的,如果让php写来写这样的事务,感觉太麻烦,倒不如我直接去mysql里面写事务好了
好,今天就来介绍mysql内置的事务处理
- DELIMITER $$
- USE `test`$$
- DROP PROCEDURE IF EXISTS `test_shiwu`$$
- CREATE DEFINER=`root`@`%` PROCEDURE `test_shiwu`(
- p_id INT,
- p_Name VARCHAR(64),
- p_address VARCHAR(64)
- )
- BEGIN
- DECLARE t_error VARCHAR(64) DEFAULT 'transaction_ok';
- /** 如果出现sql异常,则将t_error设置为'transaction_error'后继续执行后面的操作 */
- DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error='transaction_error'; -- 出错处理
- /** 显式的开启事务,它开启后,事务会暂时停止自动提交*/
- START TRANSACTION;
- INSERT INTO `test2`(`address`) VALUES(p_address); -- 语句1
- INSERT INTO `test1`(`id`,`name`) VALUES(p_id,p_Name); -- 语句2 这2个语句都可能引起报错
- IF t_error = 'transaction_error' THEN
- ROLLBACK; -- 回滚
- SELECT t_error; -- 将事务的执行状态返回给被调者
- ELSE
- COMMIT; -- 提交事务
- SELECT '成功了';
- END IF;
- END$$
- DELIMITER ;
ok 这样就搞定了,asp.net里面的TransactionOptions 也不需要使用了
我们可以看到在刚才的mysql存储过程里面,是有2个语句,其中的任意一个语句执行报错的话,都会引起回滚操作.
下面再来一个非常特殊 的情况,我们把刚才的那2个语句,换成另外一个存储过程(因为有时候,我们写sql,不止是2个sql语句,可能是更多,那么我们就需要封装到其他的存储过程里面)
- DELIMITER $$
- USE `test`$$
- DROP PROCEDURE IF EXISTS `test_shiwu`$$
- CREATE DEFINER=`root`@`%` PROCEDURE `test_shiwu`(
- p_id INT,
- p_Name VARCHAR(64),
- p_address VARCHAR(64)
- )
- BEGIN
- DECLARE t_error VARCHAR(64) DEFAULT 'transaction_ok';
- /** 如果出现sql异常,则将t_error设置为'transaction_error'后继续执行后面的操作 */
- DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error='transaction_error'; -- 出错处理
- /** 显式的开启事务,它开启后,事务会暂时停止自动提交*/
- START TRANSACTION;
- -- INSERT INTO `test2`(`address`) VALUES(p_address); -- 语句1
- -- insert into `test1`(`id`,`name`) values(p_id,p_Name); -- 语句2 这2个语句都可能引起报错
- CALL test_shiwu_desc(p_id,p_Name,p_address); -- 这个存储过程里面就只有上面的2个sql语句而已
- IF t_error = 'transaction_error' THEN
- ROLLBACK; -- 回滚
- SELECT t_error; -- 将事务的执行状态返回给被调者
- ELSE
- COMMIT; -- 提交事务
- SELECT '成功了';
- END IF;
- END$$
- DELIMITER ;
经过测试,在一个存储过程A里面,如果有事务,事务里面又包含另外一个存储过程B的话,是可以执行的.
也就是说 如果B执行失败,也是会让A进行回滚的.
最后,我们到asp.net里面,对返回的值进行判断就可以了
- string temp = jkController.Changepoint(mobile, actionType, actionId, point);
- if (temp == "transaction_error")
- {
- throw new MessageJxtException(Message.操作失败本次操作没有执行);
- }
- else if (temp == "already_login")
- {
- throw new MessageJxtException(Message.一天只能获取一次登陆积分);
- }
- else if (temp == "already_vote")
- {
- throw new MessageJxtException(Message.一个投票只能获取一次投票积分);
- }
- else
- {
- outPoint = Convert.ToInt32(temp);
- }
mysql 存储过程 事务; mysql的事务中包含一个存储过程的更多相关文章
- 分别应用include指令和include动作标识在一个jsp页面中包含一个文件。
分别应用include指令和include动作标识在一个jsp页面中包含一个文件. hello.jsp <%@ page language="java" import=&qu ...
- mysql 线上not in查询中的一个坑
今天早上开发又过来说,怎么有个语句一直没有查询出结果,数据是有的呀,并发来了如下的sql(为了方法说明,表名及查询均做了修改): select * from t2 where t2.course no ...
- 利用JS将页面中包含“一个”字段值的元素改为红色
document.body.innerHTML = document.body.innerHTML.replace(/一个/ig,"<span style='color: red;'& ...
- Perl语言入门:第七章习题:输出文件中包含一个大写字母的所有行,不输出一行的内容全是大写的
文件内容: bash-2.03$ cat file_4_ex_ch7.txt anonymous attribute demolition grammar rules indices refernce ...
- jsp 中包含 一个路径为变量的文件
<head> <base href="<%=basePath%>"> <% String fileroot="MyJsp.jsp ...
- MySQL必知必会笔记(六)存储过程 游标 触发器
留印:http://blog.sina.com.cn/s/articlelist_1254871964_5_1.html 第二十三章 使用存储过程 MySQL5 中添加了存储过程的支持. ...
- 数据库程序接口——JDBC——功能第四篇——事务之Spring事务
综述 事务的实现方式有三种,JTA,Spring事务,Web Container方式.本篇讲述Spring事务. Spring事务分为两个部分核心对象,Spring事务的实现方式. Spring事务实 ...
- SQL Server 在多个数据库中创建同一个存储过程(Create Same Stored Procedure in All Databases)
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 遇到的问题(Problems) 实现代码(SQL Codes) 方法一:拼接SQL: 方法二: ...
- Ext中包含了几个以get开头的方法
Ext中包含了几个以get开头的方法,这些方法可以用来得到文档中DOM.得到当前文档中的组件.得到Ext元素等,在使用中要注意区别使用.1.get方法get方法用来得到一个Ext元素,也就是类型为Ex ...
随机推荐
- C# 对动态编辑的一些学习笔记
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Comp ...
- RDLC报表BC4000错误
如果RDLC报表报 BC4000错误,那是因为在矩阵外上面添加了文本框的缘故,导致系统不能读到RDLC报表表体,告诉你报表没有定义: 解决办法: 把表头文字放入矩阵中.
- Activity学习(三)——跳转传值
Activity跳转与传值,主要是通过Intent类来连接多个Activity,以及传递数据. Intent是Android一个很重要的类.Intent直译是“意图”,什么是意图呢?比如你想从这个 ...
- 如何在Windows7(IIS7)环境下安装 PHP
一.安装IIS7 打开(1)[程序和功能],然后点击(2)[打开或关闭Windows功能] 勾选(1)[IIS管理控制台]和(2)CGI,然后点击[确定]按钮,等待安装完成.这个过程可能需要系统安装光 ...
- 处理HTTP状态码
1.1.4 处理HTTP状态码 上一节介绍HttpClient访问Web资源的时候,涉及HTTP状态码.比如下面这条语句: int statusCode=httpClient.executeMeth ...
- 2014多校第十场1002 || HDU 4972 A simple dynamic programming problem
题目链接 题意 : 每次无论哪个队投进一个篮球,就记下现在两队比分的差值,问你最后的结果有多少种情况. 思路 : 该题实在是不好理解,最后的结果有多少种情况就是说不管中间过程怎么来的,只要最后结果不一 ...
- Linux网络编程10——使用UDP实现五子棋对战
思路 1. 通信 为了同步双方的棋盘,每当一方在棋盘上落子之后,都需要发送给对方一个msg消息,让对方知道落子位置.msg结构体如下: /* 用于发给对方的信息 */ typedef struct t ...
- 【poj1284-Primitive Roots】欧拉函数-奇素数的原根个数
http://poj.org/problem?id=1284 题意:给定一个奇素数p,求p的原根个数. 原根: { (xi mod p) | 1 <= i <= p-1 } is equa ...
- Linux搜狗输入法在有道云笔记上输入冗余
Linux下,在有道云笔记中用搜狗拼音输入法时,会出现输入冗余,类似于输入法的缓冲上屏了.这是有道云笔记Web页面的问题. 暂时的解决办法是按Ctrl + alt + p. 不仅搜狗输入法,凡是用fc ...
- javamail邮件中插入图片
转载 http://duanmumu.blog.163.com/blog/static/1911133502012715104016481/ // TODO Auto-generated method ...