浅谈表的并发操作和锁定

来源:互联网 发布:matlab三维数组 编辑:程序博客网 时间:2024/04/29 13:27

     锁表语句 lock table t (read,read local,write)

     lock table t read语句获取只读的锁,得到后就不能对当前进程进行insert和update, 当然别的进程也不能修改,但是别的进程能同时

取得读锁, 所以我们也称读锁 为共享锁, 用read local后别的进程可以增加但是不可以修改,当前进程不能增加修改

1:

一个客户端(session1)

mysql> lock table people read;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into people(username) values('ssss');
ERROR 1099 (HY000): Table 'people' was locked with a READ lock and can't be upda

 

另开一个客户端(session2)
mysql> insert into people(username) values('ssss');

//处于阻塞状态,等待session1 的进程释放锁

 

2 :  在lock 后面到 unclock 之间 不能出现没有锁过的表,像下面的 shop

mysql> lock table people read;
Query OK, 0 rows affected (22.51 sec)

mysql> select shopname from shop limit 1;
ERROR 1100 (HY000): Table 'shop' was not locked with LOCK TABLES

 

    write  锁 也称为独享锁,在同一时刻只有一个进程可以得到,所以其他进程对数据的操作都被阻塞,只有本进程才能读写,

一个客户端(session1)

mysql> lock table people write;
Query OK, 0 rows affected (0.00 sec)

 

另外开一个客户端(session2)

mysql> select username from people limit 1;

//会阻塞状态,等待session1进程释放锁

mysql>  lock table people write;

// 想取到write锁的话  也会咬等待session1释放锁

 

通常情况下,为防止并发的写,可以用read共享锁,为防止并发读,比如多进程读取不能重复的记录,应采用write独占锁。

 

 

二:

结合实际情况 我们需要出来本段程序 以外能读出数据(所以不能用write),当前进程里能写(所以不能用read)

以上都是锁住整张表,我们最好能把表的行锁住, 查看资料得  MyAsim 只支持表级锁,InnerDB支持行级锁

 修改表的引擎为InnoDB,  使用for update来锁行 ,当操作一个非索引的字段就会自动锁表,而操作一个索引的时候会锁住一行(select * from people where peopleid=11 for update),所以有指明明确主键下是锁行,因为for update 是事务的 所以必须在begin 和commit 里生效,因为是锁行的,所以不会像 write锁那样,一个地方锁住了,另外地方就只有在等锁释放后 才能select数据了

 

 

  在InnoDB里  如果你的autocommit=1 , 用lock table people write锁表,是没有用的,会在锁表后立刻释放表锁定,当你在另外一个session里运行  select username from people limit 1  是没有在等待session1释放锁的

 

 

 

 

 

原创粉丝点击