mysql基础之锁的类型

q1871901600 发布于 2024-10-18 17 次阅读


mysql的锁,你了解哪些

按锁粒度分类:

1,行锁:锁某行数据,锁粒度最小,并发度高

在mysql的事务隔离级别(可重复读)的情况下,默认是行锁,当一个事务的读操作加锁时,另外一个事务不能操作这一行,如果读操作的这个条件没有加锁时,行锁会升级成为表锁

事务1

set tx_isolation='repeatable-read'; BEGIN; select * from article where id=2 for update;

事务2

set tx_isolation='repeatable-read'; BEGIN; UPDATE `blog`.`article` SET `article_comment_id` = 675, `article_content` = 'AFSIt6a1la', `post_time` = '2020-05-16 07:21:43', `title` = 'Miss.', `update_time` = '2001-07-15 11:01:32', `faceurl` = 'http://drive.miutake.net/Beauty' WHERE `id` = 2; COMMIT;

事务1,读操作没有提交并且加锁了,事务2中针对这一行的记录进行修改,然后提交不了,因为锁住了

事务1

set tx_isolation='repeatable-read'; BEGIN; select * from article where faceurl='http://drive.miutake.net/Beauty' for update;

事务2

set tx_isolation='repeatable-read'; BEGIN; UPDATE `blog`.`article` SET `article_comment_id` = 675, `article_content` = 'AFSIt6a1la', `post_time` = '2020-05-16 07:21:43', `title` = 'Miss.', `update_time` = '2001-07-15 11:01:32', `faceurl` = 'http://drive.miutake.net/Beauty' WHERE `id` = 9; COMMIT;

事务1,查询时的字段没有加索引,并且加锁了,这时行锁升级成了表锁,因此事务2无法对任何行做出修改或者新增

2,表锁:锁整张表,锁粒度最大,并发度低

--手动增加表锁 lock table 表名称 read(write),表名称2 read(write); --查看表上加过的锁 show open tables; --删除表锁 unlock tables;

间隙锁(Gap Lock)

间隙锁,锁的就是两个值之间的空隙,间隙锁是在可重复读隔离级别下才会生效。

上节课讲过,Mysql默认级别是repeatable-read,有幻读问题,间隙锁是可以解决幻读问题的。

临键锁(Next-key Locks)

Next-Key Locks是行锁与间隙锁的组合。

总结:

MyISAM在执行查询语句SELECT前,会自动给涉及的所有表加读锁,在执行update、insert、delete操作会自动给涉及的表加写锁。

InnoDB在执行查询语句SELECT时(非串行隔离级别),不会加锁。但是update、insert、delete操作会加行锁。

另外,读锁会阻塞写,但是不会阻塞读。而写锁则会把读和写都阻塞。

Innodb存储引擎由于实现了行级锁定,虽然在锁定机制的实现方面所带来的性能损耗可能比表级锁定会要更高一下,但是在整体并发处理能力方面要远远优于MYISAM的表级锁定的。当系统并发量高的时候,Innodb的整体性能和MYISAM相比就会有比较明显的优势了。

但是,Innodb的行级锁定同样也有其脆弱的一面,当我们使用不当的时候,可能会让Innodb的整体性能表现不仅不能比MYISAM高,甚至可能会更差。

还可以分为:

1,乐观锁:并不会真正的去锁某行记录,而是通过一个版本号来实现的

2,悲观锁:上面所得行锁、表锁等都是悲观锁