数据库锁机制:
按照数据库操作类型分:读锁、写锁
读锁(共享锁):针对同一份数据,多个读操作可以同时进行且不相互影响。
写锁(排它锁):当前写操作没有完成之前,它会阻断其他写锁和读锁。
按照数据库操作粒度分:表锁、行锁
表锁(偏读):
表锁偏向于MylSAM 存储引擎,开销小,加锁快,无思索,锁定粒度大,发生锁冲突的概率最高,并发度最低。
下面实例:
–建表sql
CREATE TABLE mylock
(
id
int(11) NOT NULL AUTO_INCREMENT,
NAME
varchar(20) DEFAULT NULL,
PRIMARY KEY (id
)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
–插入数据
INSERT INTO test
.mylock
(id
, NAME
) VALUES (‘1’, ‘a’);
INSERT INTO test
.mylock
(id
, NAME
) VALUES (‘2’, ‘b’);
INSERT INTO test
.mylock
(id
, NAME
) VALUES (‘3’, ‘c’);
INSERT INTO test
.mylock
(id
, NAME
) VALUES (‘4’, ‘d’);
–加读锁
lock table mylock read;
–查询当前表:可以查询到记录,操作成功
select * from mylock;
–当前会话查询其他表,操作失败
select * from student
–查询其他表:查询不到记录
select * from student;
–插入数据失败:当前session中更新、插入表操作都失败
其他session中更新、插入表操作都会一直在运行中状态
INSERT INTO mylock(name
) VALUES (‘f’)
–删除表锁
unlock tables;
–加写锁
lock table mylock write;
---- 加锁之后当前session下增删改查操作都能执行
select * from mylock
insert into mylock(name) VALUES(‘m’);
update mylock set name
= ‘h’ where id = 1;
delete from mylock where id = 5;
–当前session下查询其他表失败
select * from student
–其他session下查询mylock表,一直保持执行状态
select * from mylock
总结:读锁会阻塞写,但不会阻塞读
写锁会阻塞读,也会阻塞写。