MySql实战篇:写一个简单的存储过程,完成订单定时任务

喜欢吃鱼的青年 2018-05-02 13:25:16 ⋅ 99 阅读


前言

之前我们分享了MySql的性能优化、索引详解等内容,本篇文章主要是针对想要入门MySql存储过程的读者而写的。主要实现的业务是订单库里面的超过30分钟没有支付的订单全部置为失效订单。

创建订单表

CREATE TABLE `shop_order` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '订单ID',
  `good_id`int(11) NOT NULL COMMENT '商品ID',
  `order_amount` decimal(11,2) NOT NULL COMMENT '订单金额',
  `status` varchar(10) NOT NULL COMMENT '订单状态:0:交易待支付,1:交易支付中,2:交易成功、3:交易关闭',
  `create_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商城订单表';

插入测试数据

insert into shop_order(id,good_id,order_amount,status, create_date, update_date)values(1,1,99.00,0,NOW(),NOW());
insert into shop_order(id,good_id,order_amount,status, create_date, update_date)values(2,3,126.00,0,NOW(),NOW());
insert into shop_order(id,good_id,order_amount,status, create_date, update_date)values(3,9,45.00,0,NOW(),NOW());

如下图所示:


编写存储过程定时任务

BEGIN
    UPDATE 
      `shop_order` AS order_ 
    set
      order_.`status` = '3' 
    WHERE 1 = 1 
      AND order_.status = '0' 
      AND TIMESTAMPDIFF(MINUTE, order_.`create_date`, NOW()) > 30;END

解读:存储过程执行的时候如果超过30分钟并且订单状态为0(交易待支付)的订单修改状态为3(已失效)。

设置定时计划


备注:时间可以根据具体情况进行调整哦!

总结

存储过程的优点

(1).增强SQL语言的功能和灵活性:存储过程可以用控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。

(2).标准组件式编程:存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。

(3).较快的执行速度:如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。

(4).减少网络流量:针对同一个数据库对象的操作(如查询、修改),如果这一操作所涉及的Transaction-SQL语句被组织进存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大减少网络流量并降低了网络负载。

(5).作为一种安全机制来充分利用:通过对执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。

存储过程的弊端

1.架构不清晰,不够面向对象

存储过程不太适合面向对象的设计,无法采用面向对象的方式将业务逻辑进行封装,业务逻辑在存储层实现,增加了业务和存储的耦合,代码的可读性也会降低,

2.开发和维护要求比较高

存储过程的编写直接依赖于开发人员,如果业务逻辑改动较多,需要频繁直接操作数据库,大量业务降维到数据库,很多异常不能在代码中捕获,出现问题较难排查,需要数据库管理人员的帮助。

3.可移植性差

过多的使用存储过程会降低系统的移植性。在对存储进行相关扩展时,可能会增加一些额外的工作。

使用场景

普通的项目开发中,不建议大量使用存储过程,对比SQL语句,存储过程适用于业务逻辑复杂,比较耗时,同时请求量较少的操作,例如后台大批量查询、定期更新等。

(1)当一个事务涉及到多个SQL语句时或者涉及到对多个表的操作时可以考虑应用存储过程

(2)在一个事务的完成需要很复杂的商业逻辑时可以考虑应用存储过程

(3)比较复杂的统计和汇总可以考虑应用后台存储过程

关注我们

可以关注“IT实战联盟”公众号并留言也可以加入交流群和作者互撩哦~~~



全部评论: 0

    我有话说:

    MySql实战:建立高性能Mysql技巧

    体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站开发都选择 MySQL 作为网站数据库......

    Mysql优化---订单查询优化(1):视图优化+索引创建

    本文针对电商订单业务进行Mysql优化

    MySql实战:正确理解并使用MySql索引

    索引是存储引擎用于快速查找记录一种数据结构,通过合理使用数据库索引可以大大提高系统......

    京东到家订单中心系统mysql到es转化之路

    大,造成了订单数据读多情况。 我们把订单数...

    MySQL可视化管理后台,phpMyAdmin 4.9.3 和 5.0.0 发布,

    phpMyAdmin是一个非常受欢迎基于webMySQL数据库管理工具。

    「开源资讯」MySQL 8.0.22 GA发布,有变化

      MySQL 最新版本 8.0.22 于2020年10月19日正式发布。 主要新变化 改进审计日志:对于JSON格式日志文件,MySQL企业审计支持使用audit_log_read

    为什么说作为程序员分库分表必要性一定要掌握?

      互联网大厂程序员必须掌握海量数据和高并发问题处理技能,期望进入大厂程序员一定要仔细看这MySQL 分库分表是做什么? 相信很多程序员对 MySQL 都比较熟悉了,目前国内

    老板要我开发一个简单工作流引擎

    第1关 一天,老板找到我,说要做个简单工作流引擎。 我查了一天啥是工作流,然后做出了如下版本: 按顺序添加任意个审批人组成一个链表,最后加一个结束节点 记录当前审批人,当审批完后,审批人向后

    使用 NodeJS 实现一个简单区块链

    每天我们都会听说发现新数字货币消息,或者有人说它们是一个很快就会爆炸大泡沫,其中只有区块链会留下。

    PowerJob —强大分布式任务调度与计算框架

    PowerJob让您轻松完成作业调度与繁杂任务分布式计算。

    MySql 8 新特性 - CTE 通用表表达式(先睹为快)

    前言Mysql 8 正式发布了,新增了很多优秀特性,之后我会挑些重点来分享。下面和大家一起熟悉下 CTE......

    MySQL 插入 100万 条数据整理笔记

    多线程插入(单表) 问:为何对同一个表插入多线程会比单线程快?同一时间对一个操作不应该是独占吗? 答:在数据里做插入操作时候,整体时间分配是这样: 1、多链接耗时 (30

    架构实战一个可供中小团队参考微服务架构技术栈

    作者近年一直一线互联网公司(携程,拍拍贷等)开展微服务架构实践,根据我个人一线实践经验和我平时对Spring Cloud调研,我认为Spring Cloud技术栈中有些组件离生产级开发尚有

    前端实战:JavaScript 反调试技巧简单应用(上)

    最近作者看了一些关于JavaScript反调试帖子,今天给大家整理一下希望有帮助。

    关于MySQL 通用查询日志和慢查询日志分析

    MySQL日志包括:错误日志、二进制日志、通用查询日志、慢查询日志等等。这里主要介绍下比较常用两个功能:通用查询日志和慢查询日志。

    Node实战:Nodejs 链接 Mariadb 实例

    MariaDB数据库管理系统是MySQL一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB目的是完全兼容MySQL

    「开源资讯」任务调度中间件PowerJob 3.3.0 发布

    PowerJob简介 PowerJob是全新一代分布式调度与计算框架,能让您轻松完成作业调度与繁杂任务分布式计算。 下载地址:https://gitee.com/KFCFans/PowerJob

    前端实战:JavaScript 反调试技巧简单应用(下)

    通过时间差异、DevTools检测(Chrome)、隐式流完整性控制和 代理对象来达到JavaScript反调试目