不能创建 没有mysql.sock文件.lock是怎么回事

mysql中lock tables与unlock tables(锁表/解锁)使用总结-mysql教程-数据库-壹聚教程网mysql中lock tables与unlock tables(锁表/解锁)使用总结
在mysql中锁表与表解锁,我们用到lock与unlock了,今天我来给各位朋友整理一些在使用lock tables与unlock tables过程中的一些经验分享。
php mysql lock tables 使用有感
mysql 的 表锁 lock tables 感觉就像一个 封闭的空间
mysql发现 lock tables 命令的时候,会将带有锁标记的表(table) 带入封闭空间,直到 出现 unlock tables 命令 或 线程结束, 才关闭封闭空间。
进入封闭空间时 , 仅仅只有锁标记的表(table) 可以在里面使用,其他表无法使用。
锁标记 分为 read 和 write 下面是 两种 锁的区别
--------------------------------------------------------------------
//如 将 table1 设为read锁, table2 设为write锁, table3 设为read锁
lock tables [table1] read,[table2] write,[table3]
----------------------------------------------------------------------
//执行到这里时,进入封闭空间。
1. table1 仅允许[所有人]读,[空间外]如需写、更新要等待[空间退出],[空间内]如需写、更新会引发mysql报错。
2. table2 仅允许[空间内]读写更新,[空间外]如需写、更新要等待[空间退出]。
3. table3 仅允许[所有人]读,[空间外]如需写、更新要等待[空间退出],[空间内]如需写、更新会引发mysql报错。
----------------------------------------------------------------------
//执行到这里时,退出封闭空间,释放所有表锁
unlock tables
----------------------------------------------------------------------
当前线程关闭时,自动退出封闭空间,释放所有表锁,无论有没有执行 unlock tables
上面一堆东西感觉很乱,下面我们看个实例吧。
在某个地方看到有个例子,具体描述类似如下:商店现在某商品只有1件库存,然后A与B在网上进行下订,A与B几乎同时(或许也就差几毫秒,A比B快那么一点点)进行。
很明显是只有A才能成功下单的,B则会收到库存不足的提示,但是作为放置在服务端的那个页面(或者称为脚本程序)我们得怎样去处理这个问题呢?或者我先放出一段代码吧。
&&& $sql = & number from goods where id=1&;
&&& $number = intval( $db-&result( $db-&query( $sql ), 0 ) );
&&& if ( $number & 0 ) {
&&& sleep( 2 );
&&& $sql = &update goods set number=number-1 where id = 1&;
&&& if ( $db-&query( $sql ) ) {
&&& echo 'Ok!Here you are!';
&&& } else {
&&& echo 'Sorry!Something go wrong!Try it again.';
&&& } else {
&&& echo 'No more!you are so late!';
这部分代码除了缺少一定注释外都写得没错,当然$db是一个操作的类,我只是将大部分方法封装了,这里的逻辑也是很明显了。
先获取id为1这个东东的库存数,看看是否为0,如果为0就订购不成功了,如果大于0则将库存减1然后提示ok。这确实没有任何错误,逻辑也对。如果请求是一个接一个地产生的,那么什么问题都没有,但当一些并发情况(paperen也不想用这种专业的名词,其实就是上面那个例子的情况,在相差不明显的时间内有多个请求产生)出现时就可能出现一些无厘头的问题了。你想啊,是不是可能存在一种情况,A刚发出请求,脚本处理到update之前B又发出请求,那么现在库存依然还有1,因为A的update还没有执行呢,所以$number不少于0,这次完了,B也下单了,于是库存变成-1了(假设原来只有1件),确实是一个荒谬而且比较搞笑的结果。
出现问题的原因很明显,就是忽略了这种并发情况的考虑,处理下订应该是种队列方式,也就是先来先得,就是说在执行这个下订动作是要排队的,前面的那个先下订然后后者才能下订,当然当后者下订前才再判断库存的数量。那么怎样解决这个问题呢,在程序层面上貌似真的没有方法去解决这个问题(paperen可没想到代码上的解决方案,有思路的可以留个言),所以在此才提到锁表的概念,你想啊,上面出现这个问题的归根于没有控制一个select number的先后顺序(或者可以这么说吧),因为在A执行update之前你又允许B去查询库存,当然结果还是1,至少要等待A更新库存后才允许其他人的任何操作,也就是对goods表进行一个排队操作,对goods表进行锁定。
说到这里,请不要以为锁表有多么高深,其实它就是一条sql
&&& LOCK TABLE `table` [READ|WRITE]
&&& UNLOCK TABLES;
引用专业的描述是
LOCK TABLES为当前线程锁定表。 UNLOCK TABLES释放被当前线程持有的任何锁。当线程发出另外一个LOCK TABLES时,或当服务器的连接被关闭时,当前线程锁定的所有表会自动被解锁。&
如果一个线程获得在一个表上的一个READ锁,该线程和所有其他线程只能从表中读。 如果一个线程获得一个表上的一个WRITE锁,那么只有持锁的线程READ或WRITE表,其他线程被阻止。
已经是有种队列的味道,对不,所以解决方案很简单嘛,在select前加锁,执行完后面逻辑代码后解锁。或许有没有人会有一个疑问,就是如果万一锁表后线程就断掉了那么是不是就一直锁表了,这个确实是可能存在但是既然你想到了那么的设计人员也一定考虑到了,可以告诉你关于unlock的一些资料:当线程发出另一个 LOCK TABLES,或当与服务器的连接被关闭时,被当前线程锁定的所有表将被自动地解锁。这下放心了吧。
好,看下改进后的代码。
$db-&lock( 'goods', 2 );
&&& $sql = &select number from goods where id=1&;
&&& $number = intval( $db-&result( $db-&query( $sql ), 0 ) );
&&& if ( $number & 0 ) {
&&& sleep( 2 );
&&& $sql = &update goods set number=number-1 where id = 1&;
&&& if ( $db-&query( $sql ) ) {
&&& echo 'Ok!Here you are!';
&&& } else {
&&& echo 'Sorry!Something go wrong!Try it again.';
&&& } else {
&&& echo 'No more!you are so late!';
&&& $db-&unlock();
只加了两行代码,不过也不能这么说,因为paperen我修改了自己那个操作数据库的类,加了两个方法lock与unlock,其实这两个方法也很简单。
&&& * 锁表
&&& * @param string $table 表名
&&& * @param int $type 读锁1还是写锁2
&&& public function lock( $table, $type = 1 ) {
&&& $type = ( $type == 1 ) ? 'READ' : 'WRITE';
&&& $this-&query( &LOCK TABLE `$table` $type& );
&&& * 解锁
&&& public function unlock() {
&&& $this-&query( &UNLOCK TABLES& );
关于lock自己可以再斟酌一下,因为第二个参数这样弄看上去并不太舒服。嗯哼~那怎测试呢?paperen使用jmeter进行测试结果
关于jmeter可以在http://jakarta..org/site/downloads/downloads_jmeter.cgi 这里下载,在邪恶的人手中可以是一个恐怖的工具在善良的人手中是一个友好的工具。
您需要创建两个线程,其实就是对服务器发出两个请求。
具体配置paperen在此不说,我导出了一个计划文件,大家可以试着打开就能看到paperen是怎测试的了。/demo/locktable/locktable.jmx
保存下来然后导入必需调整一下你本地测试的路径,最后ctrl+R(运行),在线程下查看结果树就有请求的回应信息了。
首先测试不加锁表的情况(就是一开始不加lock与unlock操作的代码)看看两个线程出来的结果。
都是ok~~再看数据库
然后将number改回1,再将lock与unlock,锁表操作加上,再运行。
好吧,数据表就不用看了吧,结果已经很明显了,再前一个请求对表操作完成之前,之后那些请求都要在等待,直到前面请求完成了才能操作,也就是队列的味道。
老实说mysql的事务也需要下点功夫研究一下,paperen关于锁表的了解也就是在查看事务的过程中产生的,在高级的应用过程中这种技术就更加重要,更加严谨的逻辑代码与严谨的数据库管理才能更进一步保证数据的真实与准确性。真是后知后觉。
上一页: &&&&&下一页:相关内容&&&&&&&&&&&&&&&&&&
留言簿(43)
DELPHI资源
ORACLE资源
PHP学习网站
学习JAVA网站
积分与排名
阅读排行榜
评论排行榜
问题描述:
1.mysql安装完成后,使用
service mysqld restart
总是出现stop mysqld service 失败。
2.使用mysql -uroot -p登录出现找不到 /var/lib/mysql/mysql.sock问题。
3.使用service mysqld status出现 mysql dead but subsys locked
解决方法:
大多数mysql都是rpm方式安装的。它会自动寻找/var/lib/mysql/mysql.sock这个文件。
1.首先检查mysql.sock的位置。
通过/f中的socket的字段。
如果socket如下所示:
socket=/tmp/mysql.sock
2.为mysql.sock增加软连接(相当于windows中的快捷方式)。比如实际的mysql.sock在/tmp/下。
则运行如下命令。
ln -s /tmp/mysql.sock /var/lib/mysql/mysql.sock
3.如果上述两种方法都不生效。那么使用
3.1 service mysqld restart
3.2 service mysqld status
如果出现 mysql dead but subsys locked
我的rhel5.4执行了3.1以后就ok了
然后执行mysqladmin –u root password scf
阅读(13820)&mysqlsocklock & tmpmysqlsock & macmysqlsocklock最新电视剧,免费电视剧,每天第一时间更新,mysqlsocklock放送最新好看的高清免费电视剧!
mysqlsocklock最新港台剧
港台剧/1998
港台剧/2004
港台剧/1981
港台剧/1989
港台剧/1989
港台剧/2014
港台剧/2003
港台剧/2005
港台剧/2002
港台剧/1994
港台剧/2006
港台剧/1995
港台剧/1991
港台剧/2000
港台剧/2010
港台剧/2010
港台剧/2007
港台剧/2003
港台剧/1975
港台剧/2012
港台剧/1989
港台剧/2013
港台剧/1998
港台剧/2009
港台剧/2008
港台剧/2012
港台剧/2011
港台剧/1981
港台剧/2005
港台剧/2012
港台剧/2004
港台剧/1998
港台剧/1991
港台剧/1993
港台剧/2009
港台剧/2003
港台剧/1986
港台剧/1988
港台剧/2005
港台剧/2008
mysqlsocklock最新战争片
战争片/1976
战争片/2011
战争片/2013
战争片/2008
战争片/2002
战争片/2002
战争片/2011
战争片/2003
战争片/2004
战争片/1997
战争片/2010
战争片/1980
战争片/1943
战争片/未知
战争片/1992
战争片/2009
战争片/1959
战争片/1999
战争片/2007
战争片/1988
战争片/2004
战争片/1975
战争片/2011
战争片/2013
战争片/1979
战争片/2000
战争片/2007
战争片/2010
战争片/2012
战争片/2012
战争片/2011
战争片/1999
战争片/2009
战争片/1988
战争片/2012
战争片/2010
战争片/2013
战争片/2006
战争片/未知
mysqlsocklock最新剧情片
剧情片/2014
剧情片/2001
剧情片/2008
剧情片/2004
剧情片/2011
剧情片/2002
剧情片/2014
剧情片/1990
剧情片/1995
剧情片/2010
剧情片/2011
剧情片/2013
剧情片/2011
剧情片/2011
剧情片/2014
剧情片/2008
剧情片/2014
剧情片/2013
剧情片/2014
剧情片/1995
剧情片/1980
剧情片/1950
剧情片/1977
剧情片/2010
剧情片/2008
剧情片/2013
剧情片/2011
剧情片/2008
剧情片/1993
剧情片/1936
剧情片/2008
剧情片/2014
剧情片/2013
剧情片/2013
剧情片/2013
剧情片/未知
剧情片/2014
剧情片/2013
剧情片/2014
剧情片/2010
mysqlsocklock最新欧美剧
欧美剧/2015
欧美剧/2014
欧美剧/2014
欧美剧/2014
欧美剧/2014
欧美剧/2014
欧美剧/2014
欧美剧/2012
欧美剧/2013
欧美剧/2014
欧美剧/2014
欧美剧/2014
欧美剧/2011
欧美剧/2007
欧美剧/2008
欧美剧/2011
欧美剧/2009
欧美剧/2004
欧美剧/2002
欧美剧/2004
欧美剧/2009
欧美剧/2009
欧美剧/2003
欧美剧/2004
欧美剧/2013
欧美剧/2007
欧美剧/2008
欧美剧/2013
欧美剧/2001
欧美剧/2010
欧美剧/2008
欧美剧/2003
欧美剧/2005
欧美剧/2001
欧美剧/2014
欧美剧/2010
欧美剧/2010
欧美剧/2016
欧美剧/2015
欧美剧/2016
mysqlsocklock最新动作片
动作片/1986
动作片/2012
动作片/2011
动作片/未知
动作片/1990
动作片/未知
动作片/未知
动作片/1992
动作片/1984
动作片/2010
动作片/2003
动作片/2015
动作片/1993
动作片/2008
动作片/2014
动作片/2008
动作片/2015
动作片/2014
动作片/2014
动作片/2013
动作片/2006
动作片/1995
动作片/2012
动作片/2006
动作片/2014
动作片/2011
动作片/2012
动作片/2014
动作片/2008
动作片/1984
动作片/2007
动作片/2013
动作片/2007
动作片/1986
动作片/2004
动作片/1989
动作片/1983
动作片/1989
动作片/1996
动作片/2000
20HD国语配音
20BD国语配音
mysqlsocklock推荐
Inc. All Rights Reserved.
mysqlsocklock macmysqlsocklock tmpmysqlsocklock
Processed in: 0.1776 second(s),&157
queries 14.56 mb Mem On. 返回mysql没有生成mysqld.sock是什么原因?要怎么解决_百度知道mysql 更改pid和sock位置之后无法启动 - 跟谁学
搜索你想学的科目、老师试试,例如“托福”搜索吉安
&&mysql 更改pid和sock位置之后无法启动如题 在更改my.cnf的pid和sock之后无法启动mysql了 1.输入:/etc/init.d/mysql restart Stopping MySQL database server mysqld
[fail] Starting MySQL database server mysqld
[fail] 2.输入: 3.输入:ps aux |grep mysqld
0:00 /bin/sh /usr/bin/mysqld_safe tender
1.4 40 pts/12
0:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --log-error=/var/log/mysql/error.log --pid-file=/var/lib/mysql/mysql.pid --socket=/var/lib/mysql/mysql.sock --port=3306 root
0:00 grep --color=auto mysqld 4.error log的显示: mysqld_safe A mysqld process already exists 5.找到进程(如3)并杀死之后: 换了一个pid再次出现. 6.sudo service stop和start是正常的 分别显示mysql stop/waitting和mysql start/running.但是etc/init.d/mysql status 仍然会显示 MySQL stoppedtenderwhyreal
A mysqld process already exists一个mysqld进程已经存在.
意思就是之前的mysqld没关, 然后你又启动了一个. 所以你知道该这么做了吧.
问题已解决 更改my.cnf时请一起更改f
相关问题大家都在看最新提问
关注我们官方微信关于跟谁学服务支持帮助中心

我要回帖

更多关于 mysql.sock.lock 的文章

 

随机推荐