在描述使用存储过程解决事务并发之前,简单描述下上下问。  我做了一个简单积分的对外接口,因为需要做几个表的查询和创建更改,在调用特别频繁的时候,会发现小范围阻塞的情况,作为同步的接口,这种时间消耗也难让人接受…  

事务是做什么的?  他可以保证你的一系列dml语句要么都做,要么都别做.   那么存储过程又是干嘛的? 

存储过程可以说是一个服务,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),代码块就相当于函数,既然是函数了,那么你就可以调用它。


存储过程的好处:


1.由于数据库执行动作时,是先编译后执行的。然而存储过程是一个编译过的代码块,所以执行效率要比T-SQL语句高, 毕竟不用每次都实时编译了.

2.存储过程可以介绍大量的网络io的消耗,因为存储过程是可编程的,所以他可以替代大堆的T-SQL语句,当然也就降低网络的通信量,提高通信速率。

很多的电商平台,当然除了那种淘宝,京东这种典型的大流量平台之外,好多公司的解决方案都是使用存储过程来解决事务上的并发。 因为涉及到钱和积分这类的东西,一定要使用事务的。 一般的逻辑是这样,来了一个用户做消费的请求,那么我会在状态表里查看他账号是否有问题,然后扣除积分,商品的数目减一,最后加入他的订单信息,最后返回给用户。 这个简单的消费过程,他访问mysql的次数达到4次。 

为了保证订单的数据安全性,我们会加事务锁。  那么,同时又来了几个用户来消费,那他们只能等着事务的完毕了。   如果我们用存储过程是解决事务,那性能要好很多,我只需要调用已经创建好的存储过程,就解决了所有的事情。  一次网络io,全部解决….


下面是mysql事务锁的级别,这个是必须要懂得.

另外:
Mysql的默认隔离级别是:REPEATABLE READ  ,   READ UNCOMMITTED级别会导致数据完整性的严重问题,需要自己控制如何保持数据完整性.
SERIALIZABLE会导致性能问题并增加死锁的机率,  所以尽量少用. 

该文章写的有些乱,欢迎来喷 ! 另外文章后续不断更新中,请到原文地址查看更新.

http://xiaorui.cc/?p=3545

定义事务的方法
MySQL默认的行为是在每条SQL语句执行后执行一个COMMIT语句,从而有效的将每条语句独立为一个事务.  

那么事务怎么打开? 存储过程的事务使用方法跟日常用法没区别.  
1,  设置MySQL的autocommit属性为0,默认为1 ,  注意你的python客户端autocommit配置.
2,使用START TRANSACTION语句显式的打开一个事务
上面已经说了,当使用START TRANSACTION开始一个事物的时候,则SET autocommit=0不会起作用,因为START TRANSACTION会隐式的提交session中所有当前的更改,结束已有的事务,并打开一个新的事务。

我就不把自己业务上的关于事务的存储过程给贴出来了,涉及到好几个表,几个状态的判断,及返回值。  这里贴一个简单的存储过程事务, 有兴趣深入的朋友可以自己看看mysql的存储过程语法,他是兼容变量赋值,if  else while  for 的用法… 

在mysql client调用的方法很简单.


如果你是使用python的peewee库,那么只需这么调用就可以了。

如果是python的mysqldb ,那么….

END.



对Python及运维开发感兴趣的朋友可以加QQ群 : 478476595 !!!
{ 2000人qq大群内有各厂大牛,常组织线上分享及沙龙,对高性能及分布式场景感兴趣同学欢迎加入该QQ群 }

另外如果大家觉得文章对你有些作用!   帮忙点击广告. 一来能刺激我写博客的欲望,二来好维护云主机的费用.
如果想赏钱,可以用微信扫描下面的二维码. 另外再次标注博客原地址  xiaorui.cc  ……   感谢!
暂无相关产品