SQL4

锁机制

意义:解决资源共享,并发问题。
示例:买衣服X
A: X 买了X
B: 看到了X,使得X卖了两次
解决:买衣服的时候加个锁 -> 试衣服 -> 下单 -> 打包
B想买的时候发现了X被加锁,解锁的时候,其他人才能买,买完就可以被看到被买了

分类

  • 操作类型
    1 读锁:共享锁
    同一个衣服,可以读操作,互不干扰

2 写锁:互斥锁
如果当前写操作没有关闭,买衣服的一系列操作没有完毕,则无法进行其他的读(带到试衣间了,也不能读了),写锁。

  • 操作范围

1 表锁
一次性锁一张表,如MyISAM,开销小,加锁快,无死锁,但是锁的范围大,容易发生冲突,并发度低

2 行锁
一次性对一条数据加锁,比表锁冲突的概率低,如InnoDB用的行锁,开销小,加锁慢,容易发生死锁,很小的概率发生高并发问题(脏读,幻读,不可重复读,丢失更新)

死锁,两个数据都在相互等待对方

  • 例子
    表锁:
//自增操作,MySQL/SQL server可以,oracal不支持
create table tablelock(
id int primary  key auto_increment,
name varchar(20)
)engine myisam;

insert into tablelock(name) values('a1');
insert into tablelock(name) values('a2');
insert into tablelock(name) values('a3');
insert into tablelock(name) values('a4');
commit;

增加锁
local table 表 read/write

加一个读锁
 lock table tablelock read;

释放锁
unlock tablelock;

读取表的状态
show open tables;

image.png

加了一个读锁,试图删除表的一列,会报错,读取就可以
加锁读

会话对A加了读锁,那么也不能对其他表进行读写
image.png

其他会话进行写操作,会一直等待


image.png

增加写锁
会话0:

lock table tablelock write;
  • 当前会话可以对该表进行增删改查,但是不能对其他的表进行操作
  • 可以对上面表进行增删改查,但是要上面释放锁

总结

MyISAM在对表格进行写操作的时候,会对表加写锁,读的时候加上读锁,所以会有下面的情况:

  • 对一个表读的时候,会对表进行加读锁,其他进行可以读,但是不能够写,只有当写锁
  • 对一个表写的时候,会对表进行加写锁,其他会话都不能进行读写操作

你可能感兴趣的:(SQL4)