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

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

TransactionOptionstransactionOption = newTransactionOptions{

IsolationLevel = IsolationLevel.ReadCommitted, //设置事务隔离级别Timeout = newTimeSpan(0, 5, 10) // 设置事务超时时间为5分10秒};

using(TransactionScopescope = newTransactionScope(TransactionScopeOption.Required, transactionOption))

{

try{

stringtemp = jkController.Changepoint(mobile, actionType, actionId, point);

if(temp == "already_login")

{

throw newMessageJxtException(Message.一天只能获取一次登陆积分);

}

else if(temp == "already_vote")

{

throw newMessageJxtException(Message.一个投票只能获取一次投票积分);

}

else{

outPoint = Convert.ToInt32(temp);

}

scope.Complete(); //提交事务}

catch(Exceptionex)

{

throw newMessageJxtException(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里面,对返回的值进行判断就可以了

stringtemp = jkController.Changepoint(mobile, actionType, actionId, point);

if(temp == "transaction_error")

{

throw newMessageJxtException(Message.操作失败本次操作没有执行);

}

else if(temp == "already_login")

{

throw newMessageJxtException(Message.一天只能获取一次登陆积分);

}

else if(temp == "already_vote")

{

throw newMessageJxtException(Message.一个投票只能获取一次投票积分);

}

else{

outPoint = Convert.ToInt32(temp);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值