mysql php 锁表_PHP对于mysql 的锁表

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值