高并发下余额扣减一致性问题

2019-12-25 Stone 运维

业务场景,在购买商品时需要对余额进行查询与修改:

1、先从数据库查询余额:select balance from t_money where uid = $uid;

2、业务层:假如$balance= 100, 变动金额 $money = 80; 剩余金额 if($balance > $money) $new_balance = $balance - $money;

3、更新数据库 update t_money set balance = $new_balance where uid = $uid;


如果在高并发下,这种查询+修改就会出现问题:

同时触发两个业务:业务1和业务2,在查询的时候都是返回$balance = 100,

业务1操作金额 $money = 80,新余额:$new_balance = $balance - $money,也就是 100 - 80 = 20;

业务2操作金额 $money = 70,新余额:$new_balance = $balance - $money,也就是 100 -70 = 30; 

此时就会出现异常,更新数据后balance = 30。


暂时想到的解决方案:事务 + 缓存(redis队列)



参考文档:http://lichuanyang.top/posts/56940/

标签: 高并发 余额扣减

评论(0) 浏览(1136)

virtualBox报错 0x80004005

2019-10-12 Stone 运维

virtualBox升级之后,无法开机出现错误,错误提示:

返回 代码:  E_FAIL (0x80004005) 
组件:  MachineWrap 
界面:  IMachine {5047460a-265d-4538-b23e-ddba5fb84976} 

然后就是各种百度搜索,给出的答案也是五花八门,然后各种试,始终是报错。

然后把virtualBox还原到原来的版本,仍然出错,最后把virtualBox版本降到4.1.3,安装完成之后就能正常启动了。


参考链接:http://freewisdoms.com/how-to-fix-0x80004005-error-virtualbox-unable-to-start-virtual-machine/


标签: virtualBox报错 0x80004005

评论(0) 浏览(1374)

Apache 报错: couldn't perform authentication. AuthType not set!: /

2019-10-11 Stone 运维

使用 Apache 的虚拟机服务,出现 500 internal error。查看 error_log,看到如下报错内容:

[Fri Oct 11 00:17:46 2019] [crit] [client 124.64.30.156] configuration error:  couldn't perform authentication. AuthType not set!:

然后httpd.conf中的代码:

<VirtualHost *:80>
    DocumentRoot "/htdocs/tu/web"
    ServerName localhost:80

    ErrorLog logs/www.tu.com.error.log
    CustomLog logs/www.tu.com.access.log common

    <Directory "/htdocs/tu/web">
       Options Indexes FollowSymLinks ExecCGI
       AllowOverride all
       allow from all  
       Require all granted
    </Directory>
</VirtualHost>

百度一下,说是发现 “Require all granted” 指令只能用于 Apache 2.4,现在用的是Apache 2.2,。

只需要将 Require all granted 替换一下:

Order allow,deny
Allow from all

标签: apache报错

评论(0) 浏览(1096)

git 回滚代码到某个commit

2019-10-9 Stone 运维

1、查看commit日志
	git log
2、git回滚代码

回退到上个版本:git reset --hard HEAD^
回退到前3次提交之前,以此类推,回退到n次提交之前:
git reset --hard HEAD~3

回滚到指定commit的sha码
git reset --hard commit_id


标签: git回滚

评论(0) 浏览(1138)

ubuntu 16.04 nginx 配置gzip

2019-8-23 Stone 运维

cd /etc/nginx

vim nginx.conf

gzip on;
gzip_disable "msie6";

gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_min_length 256;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/vnd.ms-fontobject application/x-font-ttf font/opentype image/svg+xml image/x-icon;


重启nginx

systemctl reload nginx

标签: nginx gzip

评论(0) 浏览(1124)

WIN7远程桌面连接--“发生身份验证错误。要求的函数不受支持”

2019-7-25 Stone 运维

WIN7远程桌面连接--“发生身份验证错误。要求的函数不受支持”


解决方法:

开始菜单->运行gpedit.msc 打开配置项:计算机配置>管理模板>系统>凭据分配>加密Oracle修正 选择启用并选择易受攻击,配置保存后即可解决问题。



原文链接:https://blog.csdn.net/qq_27905477/article/details/80320358

评论(0) 浏览(1010)

yum 安装软件的时候报错:rpmdb open failed

2019-7-9 Stone 运维

$ cd /var/lib/rpm
$ rm -rf __db.*
$ rpm --rebuilddb
$ yum clean all


标签: rpmdb open failed

评论(0) 浏览(794)

两台linux服务器相互传文件

2019-4-3 Stone 运维

两台linux服务器传文件,可以使用sz、rz操作来传递文件,亦可以使用scp命令来传递,使用scp命令传递的前提是开始ssh。

首先说一下scp命令.


scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的。可能会稍微影响一下速度。
当你服务器硬盘变为只读 read only system时,用scp可以帮你把文件移出来。另外,scp还非常不占资源,不会提高多少系统负荷,在这一点上,rsync就远远不及它了。
虽然 rsync比scp会快一点,但当小文件众多的情况下,rsync会导致硬盘I/O非常高,而scp基本不影响系统正常使用。


1.命令格式:

scp [参数] [原路径] [目标路径]

2.命令功能:

scp是 secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令。linux的scp命令可以在linux服务器之间复制文件和目录。

3.命令参数:

-1  强制scp命令使用协议ssh1 

-2  强制scp命令使用协议ssh2 

-4  强制scp命令只使用IPv4寻址 

-6  强制scp命令只使用IPv6寻址 

-B  使用批处理模式(传输过程中不询问传输口令或短语) 

-C  允许压缩。(将-C标志传递给ssh,从而打开压缩功能) 

-p 保留原文件的修改时间,访问时间和访问权限。 

-q  不显示传输进度条。 

-r  递归复制整个目录。 

-v 详细方式显示输出。scp和ssh(1)会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题。  

-c cipher  以cipher将数据传输进行加密,这个选项将直接传递给ssh。  

-F ssh_config  指定一个替代的ssh配置文件,此参数直接传递给ssh。 

-i identity_file  从指定文件中读取传输时使用的密钥文件,此参数直接传递给ssh。   

-l limit  限定用户所能使用的带宽,以Kbit/s为单位。    

-o ssh_option  如果习惯于使用ssh_config(5)中的参数传递方式,  

-P port  注意是大写的P, port是指定数据传输用到的端口号  

-S program  指定加密传输时所使用的程序。此程序必须能够理解ssh(1)的选项。

实例如下:

1、获取远程服务器上的文件  -P:ssh 端口号,默认22; root@ip (可以使外网ip,也可是内网ip)
scp -P 888 -r root@ip1:/root/data/demo.tar.gz /data/demo.tar.gz

2、上传到远程服务器  -P:ssh 端口号,默认22; root@ip (可以使外网ip,也可是内网ip)
scp -P 888 -r /data/demo1.tar.gz  root@ip:/data/demo1.tar.gz


标签: Linux scp

评论(0) 浏览(1184)

shell使用awk分割字符

2019-4-3 Stone 运维

遇到一个问题,在日志文件a中记录的ip是有[ip],需要处理ip然后显示ip地址.

[114.33.229.117|-]
[220.165.158.173|-]
[119.82.253.63|-]
[119.82.253.206|-]
[39.137.168.230|-]
[117.86.76.98|-]
[117.94.124.25|-]
[125.74.14.50|-]
[121.234.123.52|-]
[117.67.131.103|-]
[123.152.43.41|-]
[119.82.253.182|-]
[125.74.14.34|-]
[118.89.19.33|-]
[180.123.84.234|-]
[125.74.14.45|-]
[118.24.208.163|-]


这是需要分割字符串,只保留ip地址,并且需要去重.

#!/bin/sh

cat a|awk 'gsub("^\\[","",$0)'|awk -F"[|-]" '{print $1}'|sort|uniq > b

处理之后的记录b:

114.33.229.117
117.67.131.103
117.86.76.98
117.94.124.25
118.24.208.163
118.89.19.33
119.82.253.182
119.82.253.206
119.82.253.63
121.234.123.52
123.152.43.41
125.74.14.34
125.74.14.45
125.74.14.50
180.123.84.234
220.165.158.173
39.137.168.230

标签: shell awk

评论(0) 浏览(984)

Centos虚拟机账号密码登录

2019-4-1 Stone 运维

Centos虚拟机关闭只允许ssh登录
sudo vim /etc/ssh/sshd_config

PasswordAuthentication  yes


然后重启sshd服务
service sshd restart

标签: ssh登录

评论(0) 浏览(871)

Copyright © 2019 by 海角孤星 京ICP备15056837号-1