支付业务很大程度上依赖于数据库做支持,正确的设置数据库参数以及正确的使用数据库对非常重要,我这把

自己之前的一些心得贴出来,抛砖引玉,大家可以把自己的一些心得分享出来供大家参考学习。

一.数据库配置
1.
innodb_flush_log_at_trx_commit,这个对支付业务来说是关键性的设置之一,可选的参数值有0,1,2, 支付需要设置成1.

2. 对交易以及记账部分来说,必须是innode引擎,以支持事务

3. 事务隔离级别,权衡安全性和效率,使用可重复读

4. innodb_lock_wait_timeout,这个是锁超时时间,不建议太大,怕引起雪崩

二.业务设计
1. 不用物理删除,即尽量避免用delete语句,drop命令等;通过软删除处理,即通过额外的字段标

2. 明记录的删除状态;虽然对写代码来讲有些麻烦,但实践证明是非常值得的

3. 在系统设计之初就要定好编码规范,对存入的数据做相应转换并做好escape处理

4. 除列表查询外,尽量用主键操作;核心交易系统中尽量避免非主键操作

5. 避免schema中1对多设计,概念简单,编码很难

6. 就mysql来说,尽量使用其最简单的功能,不用其高级功能如触发器,连表等

7. 就mysql来说,尽量不让其做计算功能,而是让业务层来实现计算逻辑

8. 当要锁多条记录时, 要考虑死锁的可能以及预防的措施

9. 按业务垂直划分原则,尽量把不同的业务方不同的库中

10. 坚持小事务,一个大事务与将其拆分成的十个小事务相比,小事务对数据库压力更小;另外,事务

中做尽可能少的事情,神马参数校验之类的事情能拉出去就拉出去

11. 数据库连接长时间不用超时断开是常见的,应用中需要考虑

12. 对超大型系统来说,分布式事务是有价值的;但在大多下情况下,单机事务能很好的满足需要

13. 主从延迟总是会有的,有时候会很大,设计中要考虑

14. 读写账号分开,读账号select权限即可,写账号update,insert即可

15. where条件key='value'的模式中,加上单引号总是对的,不加在某些情况下有很多令人意外的副

作用

16. 尽量使用简单的数据类型,char系列,int系列以及date系列即可

17. 事务的使用上,在线交易使用悲观锁

18. 事务框架的选择上,使用控制力度比较大的,直接TransactionManager,不推荐使用声明式事务

19. 采用InnoDB引擎,UTF8编码

20. 有状态字段的记录,状态的取值不宜太多, 6 ~ 7个应该是上限了, 最好不要超过 4个

21. 每个表都应该有自己的主键,且尽量让表内主键保持递增

22. 不使用自增主键

23. 在线查询的字段一定要建立覆盖索引

24. 分页查找一定不能直接limit m,n,一定要做优化

三. 应用规范
1. 当进行账户余额变化操作时,总是校验账户是否被冻

2. 对单据如Trade,Charge进行处理,并发总是要考虑的,需要锁记录后进行校验;从数据库查询的

时候,请先起动事务,并用select...for update;防止并发带来的问题;从性能上将,锁交易单本身不

会成为性能瓶颈

3. 更新账户余额之前必须加锁,即起事务+select...for update; 更新余额的语句建议是update table

set 余额=余额+/-发生额, 自然在代码逻辑中做各种边界值校验,包括不溢出,不小于0等

4.金额都统一单位,以分为单位合适;数据类型为有符号64位整形数合适

5. 对金额计算时,对溢出的预防总是需要的

6.使用select时,慎用*,尽量明确的枚举出字段名

7.与外部交互的地方,记录下外部发生时间

8. db命名采用"cashpay"前缀

9. 表命名采用"t_"前缀

10. 字段命名采用"F_"前缀

11. 每个表都会有一个字段记录上次更新时间

12. 在一个session中的所有数据库更新记录,上次更新时间都是一致的

Mysql规范50条的更多相关文章

  1. Mysql规范和使用注意点(转)

    命名规范: 1表名,字段名,索引名称使用小写字母,数字采用下划线进行分割 2.表名采用模块名3个缩小字符 '前缀'之后顺序为表明 3.表名,字段名不超过32个字符 4.存储尸体数据的表,名称使用名词, ...

  2. 《C+编程规范 101条规则、准则与最佳实践》笔记

    <C+编程规范 101条规则.准则与最佳实践> 0.不要拘泥于小节(了解哪些东西不应该标准化) * 与组织内现有编码规范一致即可 * 包括但不限于: - 缩进 - 行长度 - 命名规范 - ...

  3. 必须掌握的50条Linux基础操作命令

    说明: 根据笔者平时使用情况,并结合参考一些其他资料,精心整理出以下必须掌握的50条Linux基础命令. 命令: 1. ssh 登录到远程主机 $ ssh -l jsmith remotehost.e ...

  4. MySQL:一条更新语句是如何执行的

    目录 引言 更新流程图 更新流程说明 第一步:更新数据 数据页内存 Change Buffer 第二步:缓存日志内容 redo log buffer binlog cache 第三步:日志写入磁盘 两 ...

  5. 【MySql】赶集网mysql开发36条军规

    [MySql]赶集网mysql开发36条军规 2012-05-14 14:02:33 分类: Linux   写在前面的话: 总是在灾难发生后,才想起容灾的重要性: 总是在吃过亏后,才记得曾经有人提醒 ...

  6. navicat MySQL 只有1000条记录

    /*************************************************************************** * navicat MySQL 只有1000条 ...

  7. C++编程开发学习的50条建议(转)

    每个从事C++开发的朋友相信都能给后来者一些建议,但是真正为此进行大致总结的很少.本文就给出了网上流传的对C++编程开发学习的50条建议,总结的还是相当不错的,编程学习者(不仅限于C++学习者)如果真 ...

  8. mysql 查询一条记录的下一条和上一条记录

    如果ID是主键或者有索引,可以直接查找: 方法一: 查询上一条记录的SQL语句(如果有其他的查询条件记得加上other_conditions以免出现不必要的错误): select * from tab ...

  9. PHP MySQL 插入多条数据

    PHP MySQL 插入多条数据 使用 MySQLi 和 PDO 向 MySQL 插入多条数据 mysqli_multi_query() 函数可用来执行多条SQL语句. 以下实例向 "MyG ...

  10. 常用的50条linux 命令

    从今天起,咱开始正式学习python了,于是遍整理了50条linux的常用命令. 1 线上查询帮助命令 :man   遇到什么不会的命令可以 man +你想要查询的命令 (需要有网),因为是英文的所以 ...

随机推荐

  1. 【Docker】本地镜像发布到阿里云

    本地镜像发布到阿里云 本地镜像发布到阿里云流程 镜像的生成方法 1. 前面的DockerFile 2. 从容器创建一个新的镜像 docker commit [OPTIONS] 容器ID [REPOSI ...

  2. Git 覆盖刚刚 commit 的 message

    场景重现 通常噼里啪啦键盘一段猛搓后(写代码啊),然后会 git add . git commit -m "modify semo" # 注意上面 semo 应该是 some,发现 ...

  3. Nginx 301永久性转移

    我有个域名www.taadis.com, 想永久性转移到taadis.com. 前言 看到很多网友的做法是把taadis.com & www.taadis.com等多个域名放到一个server ...

  4. Visual Studio 2010 SDK

    HTML 5 Intellisense for Visual Studio 2010 and 2008 Visual Studio 2010 SDK Visual Studio 2010 SP1 SD ...

  5. Web前端入门第 23 问:CSS 选择器的优先级

    任何地方都存在阶级,CSS 选择器也不例外,也会讲一个三六九等. 选择器类别 通配符选择器 标签选择器 类选择器 ID选择器 属性选择器 伪类选择器 伪元素选择器 关系选择器 流传已久的阶级划分 选择 ...

  6. springboot 集成Swagger2报错 Failed to start bean ‘documentationPluginsBootstrapper’; nested exception is

    springboot 集成Swagger2报错 Failed to start bean 'documentationPluginsBootstrapper'; nested exception is ...

  7. ReadWriteLock:读写锁

    一. /* * 1. ReadWriteLock : 读写锁 * * 写写/读写 需要"互斥" * 读读 不需要互斥 * */ public class TestReadWrite ...

  8. 康谋分享 | 直面AD/ADAS快速开发挑战:IVEX自动驾驶场景管理及分析平台!

    过去十年,自动驾驶和高级驾驶辅助系统 (AD/ADAS) 软件和硬件的开发成为了各大汽车公司的主要投资目标之一.各大汽车公司对 AD/ADAS 持续不断的投资加快了 AD/ADAS 组件的开发周期,但 ...

  9. 一个Controller网关根据请求参数和版本号调用分发多个Service和方法

    一个Controller网关根据请求参数和版本号分发Service 公司原有项目就是根据请求参数进行分发逻辑的,这次想着通过反射加入了版本号的分发,减轻各种版本的业务代码逻辑耦合度. 在一个项目中需要 ...

  10. 工具 | webshell-decryptor

    0x00 简介 webshell-decryptor是一款通过获取到的webshell流量.url.key来还原攻击者使用webshell所做操作的工具. 下载地址: webshell-decrypt ...