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

  1. TransactionOptions transactionOption = new TransactionOptions
  2. {
  3. IsolationLevel = IsolationLevel.ReadCommitted, //设置事务隔离级别
  4. Timeout = new TimeSpan(0, 5, 10) // 设置事务超时时间为5分10秒
  5. };
  6. using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, transactionOption))
  7. {
  8. try
  9. {
  10. string temp = jkController.Changepoint(mobile, actionType, actionId, point);
  11.  
  12. if (temp == "already_login")
  13. {
  14. throw new MessageJxtException(Message.一天只能获取一次登陆积分);
  15. }
  16. else if (temp == "already_vote")
  17. {
  18. throw new MessageJxtException(Message.一个投票只能获取一次投票积分);
  19. }
  20. else
  21. {
  22. outPoint = Convert.ToInt32(temp);
  23. }
  24. scope.Complete(); //提交事务
  25. }
  26. catch (Exception ex)
  27. {
  28. throw new MessageJxtException(Message.操作失败本次操作没有执行);
  29. }
  30. }

这样写了之后,mysql的存储过程里面不需要做特殊处理,你写2个sql语句,任意一个报错,都会在asp.net里面被回滚的(准确的说,是如果没有报错的话,就会和自行到scope.Complete()来执行提交,否则,就不会提交,也就达到了事务)

但是现在有另外一个客户端是php来编写的,如果让php写来写这样的事务,感觉太麻烦,倒不如我直接去mysql里面写事务好了

好,今天就来介绍mysql内置的事务处理

  1. DELIMITER $$
  2.  
  3. USE `test`$$
  4.  
  5. DROP PROCEDURE IF EXISTS `test_shiwu`$$
  6.  
  7. CREATE DEFINER=`root`@`%` PROCEDURE `test_shiwu`(
  8. p_id INT,
  9. p_Name VARCHAR(64),
  10. p_address VARCHAR(64)
  11. )
  12. BEGIN
  13.  
  14. DECLARE t_error VARCHAR(64) DEFAULT 'transaction_ok';
  15.  
  16. /** 如果出现sql异常,则将t_error设置为'transaction_error'后继续执行后面的操作 */
  17. DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error='transaction_error'; -- 出错处理
  18. /** 显式的开启事务,它开启后,事务会暂时停止自动提交*/
  19. START TRANSACTION;
  20.  
  21. INSERT INTO `test2`(`address`) VALUES(p_address); -- 语句1
  22. INSERT INTO `test1`(`id`,`name`) VALUES(p_id,p_Name); -- 语句2 2个语句都可能引起报错
  23.  
  24. IF t_error = 'transaction_error' THEN
  25. ROLLBACK; -- 回滚
  26. SELECT t_error; -- 将事务的执行状态返回给被调者
  27. ELSE
  28. COMMIT; -- 提交事务
  29. SELECT '成功了';
  30. END IF;
  31.  
  32. END$$
  33.  
  34. DELIMITER ;

ok 这样就搞定了,asp.net里面的TransactionOptions  也不需要使用了

我们可以看到在刚才的mysql存储过程里面,是有2个语句,其中的任意一个语句执行报错的话,都会引起回滚操作.

下面再来一个非常特殊 的情况,我们把刚才的那2个语句,换成另外一个存储过程(因为有时候,我们写sql,不止是2个sql语句,可能是更多,那么我们就需要封装到其他的存储过程里面)

  1. DELIMITER $$
  2.  
  3. USE `test`$$
  4.  
  5. DROP PROCEDURE IF EXISTS `test_shiwu`$$
  6.  
  7. CREATE DEFINER=`root`@`%` PROCEDURE `test_shiwu`(
  8. p_id INT,
  9. p_Name VARCHAR(64),
  10. p_address VARCHAR(64)
  11. )
  12. BEGIN
  13.  
  14. DECLARE t_error VARCHAR(64) DEFAULT 'transaction_ok';
  15.  
  16. /** 如果出现sql异常,则将t_error设置为'transaction_error'后继续执行后面的操作 */
  17. DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error='transaction_error'; -- 出错处理
  18. /** 显式的开启事务,它开启后,事务会暂时停止自动提交*/
  19. START TRANSACTION;
  20.  
  21. -- INSERT INTO `test2`(`address`) VALUES(p_address); -- 语句1
  22. -- insert into `test1`(`id`,`name`) values(p_id,p_Name); -- 语句2 2个语句都可能引起报错
  23.  
  24. CALL test_shiwu_desc(p_id,p_Name,p_address); -- 这个存储过程里面就只有上面的2sql语句而已
  25.  
  26. IF t_error = 'transaction_error' THEN
  27. ROLLBACK; -- 回滚
  28. SELECT t_error; -- 将事务的执行状态返回给被调者
  29. ELSE
  30. COMMIT; -- 提交事务
  31. SELECT '成功了';
  32. END IF;
  33.  
  34. END$$
  35.  
  36. DELIMITER ;

经过测试,在一个存储过程A里面,如果有事务,事务里面又包含另外一个存储过程B的话,是可以执行的.

也就是说 如果B执行失败,也是会让A进行回滚的.

最后,我们到asp.net里面,对返回的值进行判断就可以了

  1. string temp = jkController.Changepoint(mobile, actionType, actionId, point);
  2. if (temp == "transaction_error")
  3. {
  4. throw new MessageJxtException(Message.操作失败本次操作没有执行);
  5. }
  6. else if (temp == "already_login")
  7. {
  8. throw new MessageJxtException(Message.一天只能获取一次登陆积分);
  9. }
  10. else if (temp == "already_vote")
  11. {
  12. throw new MessageJxtException(Message.一个投票只能获取一次投票积分);
  13. }
  14. else
  15. {
  16. outPoint = Convert.ToInt32(temp);
  17. }

mysql 存储过程 事务; mysql的事务中包含一个存储过程的更多相关文章

  1. 分别应用include指令和include动作标识在一个jsp页面中包含一个文件。

    分别应用include指令和include动作标识在一个jsp页面中包含一个文件. hello.jsp <%@ page language="java" import=&qu ...

  2. mysql 线上not in查询中的一个坑

    今天早上开发又过来说,怎么有个语句一直没有查询出结果,数据是有的呀,并发来了如下的sql(为了方法说明,表名及查询均做了修改): select * from t2 where t2.course no ...

  3. 利用JS将页面中包含“一个”字段值的元素改为红色

    document.body.innerHTML = document.body.innerHTML.replace(/一个/ig,"<span style='color: red;'& ...

  4. Perl语言入门:第七章习题:输出文件中包含一个大写字母的所有行,不输出一行的内容全是大写的

    文件内容: bash-2.03$ cat file_4_ex_ch7.txt anonymous attribute demolition grammar rules indices refernce ...

  5. jsp 中包含 一个路径为变量的文件

    <head> <base href="<%=basePath%>"> <% String fileroot="MyJsp.jsp ...

  6. MySQL必知必会笔记(六)存储过程 游标 触发器

    留印:http://blog.sina.com.cn/s/articlelist_1254871964_5_1.html   第二十三章 使用存储过程     MySQL5 中添加了存储过程的支持. ...

  7. 数据库程序接口——JDBC——功能第四篇——事务之Spring事务

    综述 事务的实现方式有三种,JTA,Spring事务,Web Container方式.本篇讲述Spring事务. Spring事务分为两个部分核心对象,Spring事务的实现方式. Spring事务实 ...

  8. SQL Server 在多个数据库中创建同一个存储过程(Create Same Stored Procedure in All Databases)

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 遇到的问题(Problems) 实现代码(SQL Codes) 方法一:拼接SQL: 方法二: ...

  9. Ext中包含了几个以get开头的方法

    Ext中包含了几个以get开头的方法,这些方法可以用来得到文档中DOM.得到当前文档中的组件.得到Ext元素等,在使用中要注意区别使用.1.get方法get方法用来得到一个Ext元素,也就是类型为Ex ...

随机推荐

  1. C# 对动态编辑的一些学习笔记

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Comp ...

  2. RDLC报表BC4000错误

    如果RDLC报表报 BC4000错误,那是因为在矩阵外上面添加了文本框的缘故,导致系统不能读到RDLC报表表体,告诉你报表没有定义: 解决办法: 把表头文字放入矩阵中.

  3. Activity学习(三)——跳转传值

    Activity跳转与传值,主要是通过Intent类来连接多个Activity,以及传递数据.   Intent是Android一个很重要的类.Intent直译是“意图”,什么是意图呢?比如你想从这个 ...

  4. 如何在Windows7(IIS7)环境下安装 PHP

    一.安装IIS7 打开(1)[程序和功能],然后点击(2)[打开或关闭Windows功能] 勾选(1)[IIS管理控制台]和(2)CGI,然后点击[确定]按钮,等待安装完成.这个过程可能需要系统安装光 ...

  5. 处理HTTP状态码

    1.1.4  处理HTTP状态码 上一节介绍HttpClient访问Web资源的时候,涉及HTTP状态码.比如下面这条语句: int statusCode=httpClient.executeMeth ...

  6. 2014多校第十场1002 || HDU 4972 A simple dynamic programming problem

    题目链接 题意 : 每次无论哪个队投进一个篮球,就记下现在两队比分的差值,问你最后的结果有多少种情况. 思路 : 该题实在是不好理解,最后的结果有多少种情况就是说不管中间过程怎么来的,只要最后结果不一 ...

  7. Linux网络编程10——使用UDP实现五子棋对战

    思路 1. 通信 为了同步双方的棋盘,每当一方在棋盘上落子之后,都需要发送给对方一个msg消息,让对方知道落子位置.msg结构体如下: /* 用于发给对方的信息 */ typedef struct t ...

  8. 【poj1284-Primitive Roots】欧拉函数-奇素数的原根个数

    http://poj.org/problem?id=1284 题意:给定一个奇素数p,求p的原根个数. 原根: { (xi mod p) | 1 <= i <= p-1 } is equa ...

  9. Linux搜狗输入法在有道云笔记上输入冗余

    Linux下,在有道云笔记中用搜狗拼音输入法时,会出现输入冗余,类似于输入法的缓冲上屏了.这是有道云笔记Web页面的问题. 暂时的解决办法是按Ctrl + alt + p. 不仅搜狗输入法,凡是用fc ...

  10. javamail邮件中插入图片

    转载 http://duanmumu.blog.163.com/blog/static/1911133502012715104016481/ // TODO Auto-generated method ...