mysql存储过程开启事务_mysql的存储过程会自动开启一个事务吗?

当你决定使用存储过程的时候,那么整个事务是在MYSQL端完成的。

对于事务竞争优化的主要一点就是减少事务锁时间。

你选择了使用存储过程就可以不用再代码中开启事务,深度优化即将事务SQL在MYSQL端执行(存储过程)

以下是类似的秒杀事务落地的存储过程

-- 秒杀执行存储过程

DELIMITER $$ -- ; 转换为 $$

-- 定义存储过程 in 输入参数 out 输出参数

-- ROW_COUNT 返回上一条修改类型sql(delete、insert、update)的影响函数

-- row_count 0 未修改数据 >0修改的函数 <0 SQL错误、未执行修改sql

CREATE PROCEDURE `seckill`.`execute_seckill`

(in v_seckill_id bigint,in v_phone bigint,

in v_kill_time TIMESTAMP ,out r_result int)

BEGIN

DECLARE insert_count int DEFAULT 0;

START TRANSACTION ;

insert ignore into success_killed

(seckill_id,user_phone,create_time)

VALUES (v_seckill_id,v_phone,v_kill_time)

select ROW_COUNT() into insert_count;

if (insert_count = 0) THEN

ROLLBACK;

set r_result = -1;

ElSEIF(insert_count < 0) THEN

ROLLBACK;

set r_result = -2;

ELSE

UPDATE seckill

set number = number - 1

where seckill_id = v_seckill_id

and end_time > v_kill_time

and start_time < v_kill_time

and number > 0;

SELECT row_count() into insert_count;

if (insert_count = 0) THEN

ROLLBACK;

set r_result = 0;

ElSEIF(insert_count < 0) THEN

ROLLBACK;

set r_result = -2;

ELSE

COMMIT;

SET r_result = 1;

END if;

END if;

END;

$$

-- 存储过程定义结束

DELIMITER ;

set @r_result=-3;

-- 执行存储过程

call execute_seckill(1003,18820116735,now(),@r_result);

-- 获取结果

select @r_result;

这属于并发优化的阶段了,不要过度依赖存储过程,其一般用于简单的逻辑

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值