MySQL中select * for update锁表的问题
select * for update锁表的问题
由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例) ,否则MySQL将会执行Table Lock (将整个资料表单给锁住)。
举个例子:
假设有个表单products ,里面有id跟name二个栏位,id是主键。
例1: (明确指定主键,并且有此笔资料,row lock)
SELECT * from products WHERE id='3' FOR UPDATE;
例2: (明确指定主键,若查无此笔资料,无lock)
SELECT * from products WHERE id='-1' FOR UPDATE;
例2: (无主键,table lock)
SELECT * from products WHERE name='Mouse' FOR UPDATE;
例3: (主键不明确,table lock)
SELECT * from products WHERE id<>'3' FOR UPDATE;
例4: (主键不明确,table lock)
SELECT * from products WHERE id LIKE '3' FOR UPDATE;
注1: FOR UPDATE仅适用于InnoDB,且必须在交易区块(BEGIN/COMMIT)中才能生效。
注2: 要测试
锁定的状况,可以利用MySQL的Command Mode ,开二个视窗来做测试。
相关文档:
一 . 安装与配置MYSQL
二 . 常用mysql命令行命令
1 .mysql的启动与停止
启动MYSQL服务 net start mysql
停止MYSQL服务 net stop mysql
2 . netstat –na | findstr 3306 查看被监听的端口 , findstr用于查找后面的端口是否存在
3 . 在命令行中登陆MYSQL控制台 , 即使用 MYSQL COMMEND LINE TOOL
& ......
如果你搜索GOOGLE,你会找到很多关于mysql的随机数,他们会这样说
生成3,6之间的随机整数
FLOOR(3 + (RAND() * 6))
在4后面添加一个3到6之间的整数
CONCAT(343,FLOOR(3 + (RAND() * 6)))
在某一字段后面添加一位3,6之间的整数
UPDATE test SET xx= CONCAT(xx,FLOOR(3 +(RAND() * 6)));
但是我私自测试了一下, ......
ERROR 1005 (HY000): Can't create table ' ****.frm' (errno: 150)
我是从以下几个方面解决了此问题:
1、确保参照的表和字段是存在的;
2、组成外键的字段要求被索引(主要是外键那个字段要求在其他表中是主键);
3、外键关联的两表或多表要求都是INNODB类型的表;
4、字段类型(说明)要一样`itemId` varchar( ......
导出是,没有指定编码
方法一 phpmyadmin处理方式
检查php-mbstring是否有可装,没有安装上 yum -y install php-mbstring
打开phpmyadmin 中导出,再从phpmyadmin 导入是选取二制进(binary)
如果还不行,在my.cnf mysqld中加入 default-character=你的编码, 重启mysql 再试 ......