当你决定使用存储过程的时候,那么整个事务是在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;

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

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

  1. mysql的存储过程与事务_mysql的存储过程与事务入门

    存储过程是: 通过一系列的SQL语句, 根据传入的参数(也可以没有), 通过简单的调用, 完成比单个SQL语句更复杂的功能, 存储在数据库服务器端,只需要编译过一次之后再次使用都不需要再进行编译.主要 ...

  2. mysql命令导入存储过程报错_mysql导入存储过程时declare报错的有关问题解决

    在导入存储过程时经常遇见下列DECLARE报错的问题: ? Error Code : 1064 You have an error in your SQL syntax; check the manu ...

  3. mysql数据存储过程详解_mysql数据存储过程参数实例详解

    MySQL 存储过程参数有三种类型:in.out.inout.它们各有什么作用和特点呢? 一.MySQL 存储过程参数(in) MySQL 存储过程 "in" 参数:跟 C 语言的 ...

  4. mysql 存储过程 生成数据_mysql使用存储过程,批量生成测试数据

    1.存储过程代码 delimiter $$ DROP PROCEDURE IF EXISTS create_service_data$$ create procedure create_service ...

  5. mysql建立存储过程报错_MySQL创建存储过程(CREATE PROCEDURE)

    MySQL 存储过程是一些 SQL 语句的集合,比如有时候我们可能需要一大串的 SQL 语句,或者说在编写 SQL 语句的过程中需要设置一些变量的值,这个时候我们就完全有必要编写一个存储过程. 编写存 ...

  6. mysql sql 语句事务_MySQL: 3、SQL语言 ②约束、事务

    一.SQL 约束 1.约束的作用: 对表中的数据进行进一步的限制,从而保证数据的正确性.有效性.完整性.违反约束的不正确数据将无法插入到表中 2.常见的约束: 3.主键约束: -- 特点: 不可重复. ...

  7. mysql mongodb 事务_MySQL PK MongoDB:多文档事务支持,谁更友好?

    原标题:MySQL PK MongoDB:多文档事务支持,谁更友好? 作者介绍 贺春旸,凡普金科DBA团队负责人,<MySQL管理之道:性能调优.高可用与监控>第一.二版作者,曾任职于中国 ...

  8. MySQL转账储存过程_mysql中用存储过程实现转账过程

    /* 一. 1.编写存储过程实现转账过程 2.提示: (1)涉及t_user.t_account表,新建t_transfer_log表 (2)转账金额小于100,不收手续费,在100-1000范围收取 ...

  9. mysql 存储过程游标删除_mysql数据库存储过程游标循环,提前退出

    需求:向trade这个数据库中的每一个表增加多个字段 遇到问题:存储过程,游标,循环,动态sql执行 注意: mysql 存储过程在我所使用的5.5版本中不能使用 show 的命令,利用 inform ...

  10. mysql 存储过程改用户_Mysql修改存储过程相关权限问题

    在使用mysql数据库经常都会遇到这么一个问题,其它用户定义的存储过程,现在使用另一个用户却无法修改或者删除等:正常情况下存储过程的定义者对它有修改.删除的权限:但是其它的用户就要相于的授权,不然无法 ...

最新文章

  1. SpringMVC之使用Validator接口进行验证
  2. 谁在“唱衰”OpenStack?
  3. QEMU虚拟机关键源代码学习
  4. Boost:query的使用测试程序
  5. 使用C#删除一个字符串数组中的空字符串
  6. 杀死应用进程 android,如何杀死Android应用程序启动的logcat进程?
  7. vue 开发过程中遇到的问题
  8. 基本不等式解决乘积最大问题(洛谷P1887题题解,Java语言描述)
  9. 飞鸽传书有关举证不够严谨
  10. 使用 XML Schema 定义元素的基本知识--1
  11. QT软件ICON图标在线制作
  12. html中添加cnzz,vue中移动端网页 H5网站 添加到 友盟 cnzz的方法
  13. 页面设计如何进行颜色搭配
  14. [转] vagrant学习笔记 - provision
  15. 200行Go代码实现自己的区块链——区块生成与网络通信
  16. 办理《北京市工作居住证》各项变更须提交材料
  17. 4和2大于号小于号箭头那边_认识﹥﹤=(大于号、小于号和等号), 会用符号表示两个数的大小 导学案(青岛版一年级上册)...
  18. CyclicBarrier实现赛马游戏
  19. PHP+Nginx+宝塔+rsync代码同步 实现Nginx负载均衡
  20. 如何利用编程思维,提高英语成绩?

热门文章

  1. os.getcwd()
  2. Leetcode题目practice
  3. bzoj 1207: [HNOI2004]打鼹鼠【dp】
  4. Android中实现全屏、无标题栏的两种办法(另附Android系统自带样式的解释)
  5. Ubuntu 12.04 下安装 Eclipse
  6. 【翻译】微软会投资和支持Skype在非微软平台上的业务
  7. 2020-08-18 每日一句
  8. 190720每日一句
  9. Atitit 变量类型系统 目录 1. 通用类型系统 (Common Type System) 1 1.1. CTS 的类型[编辑] 1 2. CLR支持两种基本类型:值类型和引用类型。因此,还是把
  10. Atitit 项目管理之沟通管理概论问题管理 艾提拉著 跨语言沟通 群组沟通 书面沟通 目录 1. 沟通方式 2 1.1. 书面沟通 vs 当面沟通 2 1.2. 群组沟通(公开沟通) vs