awesome-stored-procedure 羞涩发布!

前段时间因为线下分析库上的存储过程SP无规范的泛滥,导致ETL和BI报表经常出现各种死锁阻塞问题。遂决定动手整个简单的SP编码规范,其实主要目的就是记录SP的运行日志和状态。

存储过程在很多“互联网新生代”程序员的观念里可能已经是上古物件了吧?现而今大部分的互联网系统实现都不太可能采用存储过程的实现方式,因为它对数据库造成的负担、难于调试、移植性差,以及在分布式、高并发场景下的天然劣势,都阻碍了它的使用。所以阿里巴巴Java编程规范里明确规定“禁止使用存储过程”也就不足为奇了。

但是很多公司的线下关系型分析库上,SP仍旧是相当常用的一种技术手段。SP泛滥后主要容易出现以下几点病症:

1. 基于SP创建的Event运行频率和运行时长设置的盲目且随意。这会导致:

  • SP自身本次还没运行完,下一个自己就启动了,结果自己把自己锁死;
  • 不同SP之间有依赖顺序,一旦前置SP出现超时,后续的SP执行只能是错误的或者锁死的状态;

2. SP的执行过程是黑盒、不可见的。准确的说就是SP在运行过程中没有足够的日志线索,很多时候只知道卡主了,但不知道卡在那里。

3. SP没有异常处理。SP运行过程中发生错误,若没有捕获处理,导致最终运行失败,那么这个SP在整个依赖链路的越前端,恢复成本将越高昂。

上述三个问题最终都可以靠一张日志表来解决,另外为了实现序号自增,又多建了一张序号表,总共2张表。

SP日志工具的代码我已经上传到了Github上,方便自己和大家翻阅。又因为本人特别喜欢Github上的Awesome系列,顺道碰个瓷,这个代码库命名为了

awesome-stored-procedure

https://github.com/NicholasQu/awesome-stored-procedure

目前都是基于MYSQL编写的,其他数据库的有空再考虑完善一下吧。接下来简单介绍下这几个Function /Procedure。

FUNCTION getSeqNo

/**********************************************

* 使用示例

**********************************************/

select getSeqNo('mall'), getSeqNo('pay');

功能:根据序号类别,获取全局自增序号。

不同类别的交叉运行会导致序号跳空,该函数不保同一类别内序号的连续性。

PROCEDURE logSp*

/**********************************************

* 使用示例

**********************************************/

call logSpStart('sp1','testing sp1',100,@sp_exec_no);

call logSpStartAndCheck('sp1','testing sp1',100,'sp2', date_add(now(), interval -1 minute), now(), @sp_exec_no);

call logSpEnd('sp1','end sp1', @sp_exec_no);

SP启动和先决条件检查

用于记录SP启动时间和状态,并检查可以继续运行的条件是否满足:

1. 自身的运行频度较高,之前自身是否还未运行完成。该情况调用logSpStart即可;

2. 依赖其他的SP运行完成,自身方能启动。该情况需调用logSpStartAndCheck;

SP调试信息打印

用于打印Info级别的调试日志, 调用logSpInfo;

SP结束日志打印 logSpEnd

用于表示该SP已运行完成。注意这里只标识SP的完成,并不一定成功,整个SP中间过程可能发生了异常,但是继续运行完毕了。

SP异常处理

对异常进行处理。有两种方式:

1. 若该异常无关痛痒,可以继续后续逻辑的话,使用logSpErrAndContinue;

2. 若该异常直接可以导致SP终止,调用logSpErrAndEnd;

标准SP写法

参照 p_sp_demo.MYSQL.SP.sql

https://github.com/NicholasQu/awesome-stored-procedure/blob/master/recordSpLogs/p_sp_demo.MYSQL.SP.sql


传送门再贴一次

https://github.com/NicholasQu/awesome-stored-procedure

本文分享自微信公众号 - 曲水流觞TechRill(geniusiandev)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏挨踢小子部落阁

MySQL数据库安装笔记教程

下载之后,我选择直接解压到D盘,文件地址是:D:\mysql-5.7.23-winx64,这里说这么清楚,是为了接下来的环境配置。你也可以根据自己个人喜好选择对...

6410
来自专栏玄魂工作室

实战|一个企业官网上线前的渗透测试

Hello,大家好,我是Etion,一日不见如隔三秋啊,今天给大家带来的是一个中小型企业的官网的渗透(上线前的渗透测试),这个企业的网管刚把网站搭建好,网站内容...

8320
来自专栏架构专题

记一次操蛋的方案降级(云上冷热分离的坎坷之路)

系统的数据,就是公司的生命。哪怕是狗屎,我们也要将它冷冻起来冰封以备后用。垃圾的产品设计就比较让人费解,会时不时从冰柜中将屎取出,想要品尝其中残留的味道。

7530
来自专栏A周立SpringCloud

超全面的 MySQL优化 面试解析

price decimal(8,2)有2位小数的定点数,定点数支持很大的数(甚至是超过int,bigint存储范围的数)

13130
来自专栏菜鸟致敬

建议收藏 | 专业的MySQL开发规范

命名规范的对象是指数据库SCHEMA、表TABLE、索引INDEX、约束CONSTRAINTS等的命名约定

10820
来自专栏芋道源码1024

日均 5 亿查询量的京东订单中心,为什么舍 MySQL 用 ES ?

京东到家订单中心系统业务中,无论是外部商家的订单生产,或是内部上下游系统的依赖,订单查询的调用量都非常大,造成了订单数据读多写少的情况。

11410
来自专栏Lemon黄

简明PHP进阶【1-基于Window系统的开发环境】

人活在世上有两大义务,一是好好做人,无愧于人生一世。这一条我还差的很远。另外一条是不能惯着别人的臭毛病,这一条我差的更远。

4620
来自专栏椰果笔记

为VS Code配置支持git以及mysql命令的终端

通常,在web开发中,我们所使用到的如;git上传下载代码片段,mysql创建数据库等,都需要切换窗口或者通过第三方软件支持。

9820
来自专栏挨踢小子部落阁

合格的程序员,是如何写得一手好SQL???

博主负责的项目主要采用阿里云数据库MySQL,最近频繁出现慢SQL告警,执行时间最长的竟然高达5分钟。导出日志后分析,主要原因竟然是没有命中索引和没有分页处理。...

9920
来自专栏苦逼的码农

写给工程师的 MySQL 面试高频 100 问!

本文主要受众为开发人员,所以不涉及到MySQL的服务部署等操作,且内容较多,大家准备好耐心和瓜子矿泉水.

8120

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励