51Testing软件测试网%H*m$^gi:x0^Ga
//author:51Testing软件测试网i]Y1L9[t
m51Testing软件测试网2vC
MMJl%GK]P
mysql_query("lock table table write");51Testing软件测试网tO1^9b,_y9g8s/k&FZ51Testing软件测试网]zkR x
省略...51Testing软件测试网;a#B6W3D"o8a51Testing软件测试网V(ES4PgkyQ,o
mysql_query("unlock tables");N]7s(H:L*{-em051Testing软件测试网/I"Ip5MjG2g?K
LOCK TABLES按照如下方式执行:_Genp4a.m;L051Testing软件测试网e(pt-]?$W
1. 按照内部定义的顺序,对所有要被锁定的表进行分类。从用户的角度,此顺序是未经定义的。*eH_&E|
Sir0
z*j
m@0NU02. 如果使用一个读取和一个写入锁定对一个表进行锁定,则把写入锁定放在读取锁定之前。2|WD!`+FA'v#v8bvW0
"N8X8`ZL9l9w03. 一次锁定一个表,直到线程得到所有锁定为止。51Testing软件测试网~H3T%O3[9V51Testing软件测试网sXcfHI-Q3pI
该规则确保表锁定不会出现死锁定。51Testing软件测试网sIlRrK!m*gMySQL的表级锁有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)。
QVc4j[xW%R&Q+I0----------------------------51Testing软件测试网J-qxEO"QV
当前锁模式 | 读锁 | 写锁 |
%J:m7^ hG)ci0----------------------------51Testing软件测试网s]X'];O5i:i
读锁 | 是 | 否 |51Testing软件测试网z!C.A"^J[@{]
----------------------------51Testing软件测试网1x)nm)?|J6q
写锁 | 否 | 否 |
4Gc-rR%ZtL\0----------------------------
MyISAM表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求;对MyISAM表的写操作,则会阻塞其他用户对同一表的读和写操
作;MyISAM表的读操作与写操作之间,以及写操作之间是串行的!根据如表20-2所示的例子可以知道,当一个线程获得对一个表的写锁后,只有持有锁的
线程可以对表进行更新操作。其他线程的读、写操作都会等待,直到锁被释放为止。查询表级锁争用情况
:m'\D&K/Y2_)A ^xjlX%N3H0可以通过检查table_locks_waited和table_locks_immediate状态变量来分析系统上的表锁定争夺.
d%Q5K+sFI @ f0mysql> show status like 'table%';获得表table_name的WRITE/READ锁定
&@0K\*JE$M/q xV+{4[#z0mysql> lock table table_name write;51Testing软件测试网RYYKWp
mysql> lock table table_name read;
5L@a#Z2z7?Bi0解锁
2oe[i-~{/~/T/` Xp7u0mysql> unlock tables;如何加表锁51Testing软件测试网Kh6N5W1_#jF,Y
Lock tables orders read local, order_detail read local;
g8_\
a
b]5M+i0Select sum(total) from orders;
`K/[EMu#u0Select sum(subtotal) from order_detail;51Testing软件测试网g5l-d9qt]l
Unlock tables;
C*wX;g jJ;oMzm0
上面的例子在LOCK
TABLES时加了“local”选项,其作用就是在满足MyISAM表并发插入条件的情况下,允许其他用户在表尾并发插入记录.
当使用LOCK
TABLES时,不仅需要一次锁定用到的所有表,而且,同一个表在SQL语句中出现多少次,就要通过与SQL语句中相同的别名锁定多少次,否则也会出错!
举例说明如下。51Testing软件测试网"sdbP} Y?
?X&U
1.对actor表获得读锁:51Testing软件测试网D|O a;tu+\
mysql> lock table actor read;Query OK, 0 rows affected (0.00 sec)2.但是通过别名访问会提示错误:51Testing软件测试网-G0TZ(Hs/K4]?W E
mysql>
select a.first_name,a.last_name,b.first_name,b.last_name from actor
a,actor b where a.first_name = b.first_name and a.first_name = 'Lisa'
and a.last_name = 'Tom' and a.last_name <> b.last_name;ERROR 1100
(HY000): Table 'a' was not locked with LOCK TABLES3.需要对别名分别锁定:
l/{h~*jv,ke0mysql> lock table actor as a read,actor as b read;Query OK, 0 rows affected (0.00 sec)4.按照别名的查询可以正确执行:51Testing软件测试网's5ni~/x5]
mysql>
select a.first_name,a.last_name,b.first_name,b.last_name from actor
a,actor b where a.first_name = b.first_name and a.first_name = 'Lisa'
and a.last_name = 'Tom' and a.last_name <>
b.last_name;+------------+-----------+------------+-----------+|
first_name | last_name | first_name | last_name
|+------------+-----------+------------+-----------+| Lisa |
Tom | LISA | MONROE
|+------------+-----------+------------+-----------+1 row in set (0.00
sec)
#pTv^th&U051Testing软件测试网;Q6a*t#a$Dk&y
并发插入(Concurrent Inserts)
5mj3Kz SkK0 在一定条件下,MyISAM表也支持查询和插入操作的并发进行。
,V4_+uN X.@0MyISAM存储引擎有一个系统变量concurrent_insert,专门用以控制其并发插入的行为,其值分别可以为0、1或2。
-U!Nb6u*W*x01.当concurrent_insert设置为0时,不允许并发插入。51Testing软件测试网6{m7|!M-\:R_
2.当concurrent_insert设置为1时,如果MyISAM表中没有空洞(即表的中间没有被删除的行),MyISAM允许在一个进程读表的同时,另一个进程从表尾插入记录。这也是MySQL的默认设置。51Testing软件测试网4^G0wFxM#V@
3.当concurrent_insert设置为2时,无论MyISAM表中有没有空洞,都允许在表尾并发插入记录。51Testing软件测试网~LE2X/tkGi8oL
利用MyISAM存储引擎的并发插入特性,来解决应用中对同一表查询和插入的锁争用。例如,将concurrent_insert系统变量设为2,总是允
许并发插入;同时,通过定期在系统空闲时段执行OPTIMIZE TABLE语句来整理空间碎片,收回因删除记录而产生的中间空洞。[-s8oWf fx,?051Testing软件测试网&I{F#WG_8RL&k
mysql> create table t_haosee (aa int);
w3iD^NWUV0Query OK, 0 rows affected (0.05 sec)51Testing软件测试网Fm_"FWlO
F.M.xqU
Tq~7C0mysql> LOCK TABLES t_haosee WRITE;
2~jv)eqfh0Query OK, 0 rows affected (0.00 sec)
/u:yn2S8cZ:_K H
jS%`051Testing软件测试网"_C#OA~t+iJ
mysql> insert into t_haosee set aa=1;51Testing软件测试网/QjQ]@fSA.c1Mz
Query OK, 1 row affected (0.03 sec)
3_9M
^!b$Js A(y!l0
`.M9{6s(`KBKqO0mysql> insert into t_haosee set aa=2;
M9y;J;x
w&W0Y*d)gs0Query OK, 1 row affected (0.02 sec)
Ty`;x+`-K+KC0
;gU{ddv0mysql> unlock tables;51Testing软件测试网'ao7pN
vy-Q
Query OK, 0 rows affected (0.00 sec)51Testing软件测试网Lv CQ:efQ
}DWE%Zj;Q9x0mysql> select * from t_haosee;51Testing软件测试网)m;S_VN
+------+
E#bSaJ'i QC0| aa |51Testing软件测试网w:UHG)n$|
+------+
A|$@Eqe@0| 1 |
E6Ds!DQlI
g~&Q2h0| 2 |51Testing软件测试网 q~-S&t{
\&g-u
+------+
G1Pc^6ynk)wg02 rows in set (0.00 sec)51Testing软件测试网}k1Bn8IsA
51Testing软件测试网e5z3MI-?f|
mysql>QJ@ P.zQA0