• 加读锁:

会话0:
lock table tablelock read;
select * from tablelock; —读(查),可以(自己加了锁,自己可以读)
delete from tablelock where id=1; —写(增删改),不可以

在当前会话中访问其他表(emp表,未加锁):
select * from emp; —读,不可以
delete from emp where eid = 1; —写,不可以

结论1:
—如果某一个会话,对A表加了锁,则该会话可以对A表进行读操作,不能进行写操作;且该会话不能对其他表进行读、写操作。
—即如果给A表加了读锁,则当前会话只能对A表进行读操作。

会话1(其他会话):
select * from tablelock; --读(查),可以
delete from tablelock where id=1; —写,会“等待”会话0将锁释放


select * from emp; --读(查),可以
delete from emp where eid=1; —写,可以

结论2:
会话0给A表加了锁:

  • 其他会话的操作:
    a.可以对其他表(A表以外的表)进行读、写操作
    b.对A表:读–可以;写–需要等待释放锁
  • 加写锁:

会话0:
lock table tablelock write;
结论:当前会话(会话0)可以对加了写锁的表进行任何操作(增删改查);但是不能操作(增删改查)其他表

其他会话:
对会话0中加写锁的表可以进行增删改查的前提是:等待会话0释放写锁

MySQL表级锁的锁模式:
MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,
在执行更新操作(增删改(DML))前,会自动给涉及的表加写锁。

所以对MyISAM表进行操作,会有以下情况:
a.对MyISAM表的读操作(如读锁),不会阻塞其他进程(会话)对同一表的读请求,但会阻塞对同一表的写请求。只有当读锁释放后,才会执行其它进程的写操作。
b.对MyISAM表的写操作(加写锁),会阻塞其他进程(会话)对同一表的读和写操作,只有当写锁释放后,才会执行其他进程的读写操作。

标签: 增删, 会话, 操作, Mysql, emp, tablelock, 加读, 表加, 加写

相关文章推荐

添加新评论,含*的栏目为必填