标签:
杂谈 |
表锁一般没什么用,因为在事务中解除表锁的话会直接提交事务。
在事务中一般用到的是行锁,即innodb引擎支持。
共享锁例子:
#session1 会话1
start transaction;
SELECT * FROM feedback LIMIT 1,10;#无视
SELECT * FROM feedback LIMIT 1 FOR
UPDATE;#只有加行锁的这行是锁定状态(FOR UPDATE)
COMMIT; #提交事务
#session2 会话2
start transaction;
COMMIT; #提交事务
排它锁例子:
#session1 会话1
start transaction;
COMMIT; #提交事务
#session2 会话2
start transaction;
COMMIT; #提交事务
因为之前用过oracle,知道利用select * for update
可以锁表。所以很自然就想到在mysql中能不能适应for
update来锁表呢。
学习参考如下
举个例子:
假设有个表单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 ,开二个视窗来做测试。
由上面的InnoDB
已经交易区块引出两个问题。
1. what is InnoDB?
进一步:
如何查看MySQL的当前存储引擎?
一般情况下,mysql会默认提供多种存储引擎,你可以通过下面的查看:
看你的mysql现在已提供什么存储引擎:
mysql> show engines;
以上说明我的mysql默认使用的InnoDB引擎,并且支持MyISAM,memory,archive,Mrg_myisam。
看你的mysql当前默认的存储引擎:
mysql> show variables like
'%storage_engine%';
你要看某个表用了什么引擎(在显示结果里参数engine后面的就表示该表当前用的存储引擎):
mysql> show create table 表名;
后一篇:web并发访问执行

加载中…