高并发下余额扣减一致性问题
业务场景,在购买商品时需要对余额进行查询与修改:
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/
virtualBox报错 0x80004005
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/
Apache 报错: couldn't perform authentication. AuthType not set!: /
使用 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报错
git 回滚代码到某个commit
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回滚
ubuntu 16.04 nginx 配置gzip
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
WIN7远程桌面连接--“发生身份验证错误。要求的函数不受支持”
WIN7远程桌面连接--“发生身份验证错误。要求的函数不受支持”
解决方法:
开始菜单->运行gpedit.msc 打开配置项:计算机配置>管理模板>系统>凭据分配>加密Oracle修正 选择启用并选择易受攻击,配置保存后即可解决问题。
原文链接:https://blog.csdn.net/qq_27905477/article/details/80320358
yum 安装软件的时候报错:rpmdb open failed
$ cd /var/lib/rpm $ rm -rf __db.* $ rpm --rebuilddb $ yum clean all
两台linux服务器相互传文件
两台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
shell使用awk分割字符
遇到一个问题,在日志文件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
Centos虚拟机账号密码登录
Centos虚拟机关闭只允许ssh登录sudo vim /etc/ssh/sshd_config PasswordAuthentication yes
然后重启sshd服务
service sshd restart
标签: ssh登录