Laravel查询在死锁发生时返回空集合

想象一下,您有两个进程同时执行以下PHP代码,将显示什么结果?

令人惊讶的是,一个进程打印正常的查询结果,而另一个进程打印一个空集合(数组)。 返回空集合的代码并未按照我们想的那样触发死锁异常!然而,如果您查阅了transaction方法的源代码,则会发现在发现死锁之后,该方法会自动重试事务。 而且当死锁的数量达到设定值时,最终死锁将被作为异常抛出。 但是,当前这个实际发生死锁的查询看起来却很正常,因为它返回了一个空集合!

这个意外返回的空数组和未抛出的死锁异常实际上是一个古老且棘手的PHP-PDO bug。 在7.4.13发布之前,它已经广泛存在于许多PHP版本中。 有许多与此相关的讨论,例如:

  1. https://bugs.php.net/bug.php?id=76742
  2. https://github.com/php/php-src/pull/5937
  3. https://github.com/php/php-src/pull/6203
  4. https://github.com/php/php-src/commit/b03776adb5bbb9b54731a44377632fcc94a59d2f

在PHP7.4.13之前,你几乎没有办法直接检测到此错误。 切勿尝试打开PDO :: ATTR_EMULATE_PREPARES来解决此问题! 因为此选项将使您所有的PDO查询结果都变成字符串,数据类型的丢失将会导致更严重的后果。

因此,唯一可行的方法是手动编译已修复的PHP源代码,或安装新的预编译版本的PHP7.4.13。

更改MySQL的数据存储(datadir)目录

步骤很简单,在开始之前,不要忘了先停止mysql服务。

 

然后,拷贝之前旧的数据文件夹到新的位置

上面的命令会把/data/lib/mysql这个文件夹的所有内容(包括权限),拷贝到/mnt/mysql

 

然后,修改 /etc/mysql/my.cnf ,如果是Ubuntu使用mysql的apt源安装的,应该修改 /etc/mysql/mysql.conf.d/mysqld.cnf

把datadir改成你需要的位置

 

下一步我们一般不会注意到,但是如果我们不修改这步,会造成mysql无法启动

编辑 /etc/apparmor.d/usr.sbin.mysqld ,找到 # Allow data dir access ,把他下面的旧数据目录替换成你的新的

然后,执行下面的命令即可

 

参考:http://www.jianshu.com/p/5fb55e313f8c

创建一个只读的mysql账户并且可以使用mysqldump导出

 

Ubuntu 配置Node.js+Nginx+PHP+MySQL最新版本

配置环境

nginx.conf配置

默认服务器,ip返回403配置

fastcgi_params限制PHP脚本执行目录

纯静态配置

PHP一般通用配置

开启fix_pathinfo(一般默认已开启)

PHP通用框架配置

SSL+HTTP2的PHP框架配置

 

MySQL5.6.30低配机器的配置文件,最小资源占用

引用文章:http://www.tocker.ca/2014/03/10/configuring-mysql-to-use-minimal-memory.html

linux下彻底卸载mysql

停止Mysql服务

查询已安装的mysql包并删除

QQ截图20160310151708

然后复制上面的包名,分别执行

查找并删除mysql相关目录

20160310152135

把上面的目录(注意分辨一下用途),分别执行

最后删除my.cnf

 

在CentOS6.5上用rpm方法安装mysql最新版本5.7.10

首先,下载mysql-5.7.10-1.el6.x86_64.rpm-bundle.tar

你也可以到mysql的官方网站下载:http://dev.mysql.com/downloads/

QQ截图20151216190001

 

安装依赖

下载完了之后进入到相应目录,执行下面的命令

然后执行下面命令初始化,执行生会在/var/log/mysqld.log生成随机密码,最后一行可以看到

最后别忘了启动mysqld服务,更改root密码,设置开机启动和映射管道文件(php将默认使用/tmp/mysql.sock)