能不用事务就尽量别用 - CSDN博客

标签: | 发表时间:2018-03-25 19:30 | 作者:
出处:https://blog.csdn.net

概述


以前在公司里,有个牛人对俺说:

事务就是个垃圾,能不用就尽量不用。

当时我刚从传统行业切换到互联网行业,对这个牛人说的这句话是嗤之以鼻的,怎么可能不用事务呢?后来随着开发了多个高并发应用后,才知道这个牛人说的是对的。下面说两个亲身经历的案例来说明这个问题。


库存扣减接口(写事务)


当时我们有个业务,在购物车阶段的时候,就开始占用库存了,这个库存占用接口的流量非常大。当时我开发完这个接口后,测试人员的压测结果是

2500/TPS

我觉得低了,就开始怀疑测试人员是否不够专业,测试用的服务端应用服务器和数据库是否不给力,发起请求的压测客户端机器是否给力,jmeter用的是否正确。全部检查完后,发现测试手法是完全OK的。

于是仔细的检查代码,也没发现啥。后来灵光一闪,想起那个牛人说过得的话,就尝试把事务去掉。我们用的是Spring的 @Transactional(rollbackFor = Exception.class)的开启事务的。我把这行代码删除掉后,压测结果是:

3700/QPS

提高了蛮多,这个压测结果已经能满足线上流量要求了。开了事务为啥性能差这么多,底层原因目前还没仔细去研究。但是从压测结果来看,去掉事务后,性能有提升。

这里部分网友可能有疑问,如果线程操作的是多张表的写入和更新操作,如果不用事务的话,一致性怎么保证? 好问题。当时我是使用 逻辑回滚的手段来保证数据的一致性,是需要自己写代码进行数据回滚的。因为当时要操作的表只有两张,代码写起来还好些。

如果很多张表的话,用逻辑回滚就比较麻烦了。对于这种很多张表的,而流量又不是很大那种的话,还是使用事务方便一些。


读接口(读事务)


当时有个输出商品的接口,读取逻辑如下:

先从memcache读取,如果没有读取到,则从DB读取。

开发完这个接口后,做压测时,我先预热一些数据到memcache上,想看看memcache的读取性能。压测结果不太理想。当时找了很久都没找到原因,后来我用top命令观察了一下,发现只要一压测,应用还是会跟mysql有交互。理论上是不会的,因为数据都在memcache上,一旦命中就走了,不会去读取数据库。

最后面发现原来用了Spring的

@Transactional(readOnly = true)

只要你在接口上面加了这个注解,Spring还是会跟Mysql打交道的。并发的量一旦大了,就开始影响性能了。

相关 [csdn 博客] 推荐:

SpringMVC 限流 - CSDN博客

- -
在使用 SpringBoot做接口访问如何做接口的限流,这里我们可以使用google的Guava包来实现,当然我们也可以自己实现限流,Guava中的限流是久经考验的我们没必需重新再去写一个,如果想了解限流原理的同学可以自己查阅一下相关的资料,本文不作过来说明噢. 在项目中引入 Guava相关包.

Latent Semantic Analysis(LSA) - CSDN博客

- -
Latent Semantic Analysis(LSA)中文翻译为潜语义分析,也被叫做Latent Semantic Indexing ( LSI ). 意思是指通过分析一堆(不止一个)文档去发现这些文档中潜在的意思和概念,什么叫潜在的意思. 我第一次看到这个解释,直接懵逼. 假设每个词仅表示一个概念,并且每个概念仅仅被一个词所描述,LSA将非常简单(从词到概念存在一个简单的映射关系).

facebook-faiss库 - YiLiang - CSDN博客

- -
三月初,Facebook AI Research(FAIR)开源了一个名为 Faiss 的库,Faiss 主要用于有效的相似性搜索(Similarity Search)和稠密矢量聚类(Clustering of dense vectors),包含了在任何大小的矢量集合里进行搜索的算法. Faiss 上矢量集合的大小甚至可以大到装不进 RAM.

SpringCloud Gateway与k8s_zhangjunli的博客-CSDN博客

- -
接下来的内容由以下几部分组成:. 什么是SpringCloud Gateway. SpringCloud Gateway实战参考. kubernetes上的SpringCloud Gateway. 开发k8sgatewaydemo. 什么是SpringCloud Gateway. SpringCloud Gateway是SpringCloud技术栈下的网关服务框架,在基于SpringCloud的微服务环境中,外部请求会到达SpringCloud Gateway应用,该应用对请求做转发、过滤、鉴权、熔断等前置操作,一个典型的请求响应流程如下所示:.

2010年度CSDN十大博客文章

- Calvin998 - 《程序员》杂志官网
概要:这是一篇2009年写下的博文,但我们却愿意将它评选为“2010 年度CSDN十大博客文章”之首. 因为这篇“慢热型”的博文,整个2010年内,在CSDN社区内被广泛转帖,并得到网友们的交口称赞. 本文作者岑文初根据自身经历,总结出六条秘籍:爱这行;踏踏实实打好基本功;注重日常积累,厚积薄发;技术上做到既广且钻;培养分析问题能力,善于追根溯源;全面培养能力,不做纯粹“技术人员”;阿里巴巴六脉神剑文化.

python 中文文本分类 - CSDN博客

- -
3,结构化表示--构建词向量空间. 即已经分好类的文本资料(例如:语料库里是一系列txt文章,这些文章按照主题归入到不同分类的目录中,如 .\art\21.txt). 推荐语料库:复旦中文文本分类语料库,下载链接:http://download.csdn.net/detail/github_36326955/9747927.

【实践】CTR中xgboost/gbdt +lr - CSDN博客

- -
自学习 CTR预估中GBDT与LR融合方案 ,有意用简单暴利的python实现一版GBDT/XGboost做特征选择,融合LR进行CTR的代码demo. # lr对原始特征样本模型训练. print('基于原有特征的LR AUC: %.5f' % lr_test_auc). # 对所有特征进行ont-hot编码.

k8s docker集群搭建 - CSDN博客

- -
一、Kubernetes系列之介绍篇.     - 一次构建,到处运行. 2.什么是kubernetes.   首先,他是一个全新的基于容器技术的分布式架构领先方案. Kubernetes(k8s)是Google开源的容器集群管理系统(谷歌内部:Borg). 在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性.

tensorflow提取VGG特征 - weixin_38208741的博客 - CSDN博客

- -
vgg-16一种深度卷积神经网络模型,16表示其深度. 模型可以达到92.7%的测试准确度. 它的数据集包括1400万张图像,1000个类别. 一个简单的演示,提取VGG的pool5层特征,存储为.mat文件. 在我们的实际项目中,一般不会直接从第一层直接开始训练,而是通过在大的数据集上(如ImageNet)训练好的模型,把前面那些层的参数固定,在运用到我们新的问题上,修改最后一到两层,用自己的数据去微调(finetuning),一般效果也很好.

小小甜菜OpenVINO爬坑记 - oZhiZhuXia12的博客 - CSDN博客

- -
小小甜菜OpenVINO爬坑记. OpenVINO是intel提供的一个深度学习优化工具,目前可以使用在win10,Ubuntu16.04两个平台上,官方已经宣布后期会支持树莓派系统. 它是Movidius x的使用接口,同时支持多种框架,也提供了大量例程. 我使用的是UP Squared板卡,运行Ubuntu16.04.