MySQL锁相关

mysql锁分类

表锁、页锁、行锁

innodb主要是行锁、其次表锁
innodb 增删改会加锁,读取不加锁通过MVCC机制

innodb中行锁

分为共享锁(S)和排他锁(X)

共享锁:多个事务都可以对同一行加共享锁来进行读,但其他事务不能写这一行
排他锁:一个事务加锁后可以写这一行,别的事务只能读不能写

共享锁需要手动加,

select * from table where id=1 lock in share mode

排他锁在进行增删改时innodb自动加,当然也可以手动加

select * from table where id=1 for update;

innodb中表锁

分为意向共享锁和 意向排他锁

意向共享锁:在加共享行锁的时候,必须先加这个共享表锁
意向排他锁:给某行加排他锁的时候,必须先给表加排他锁。

表锁是innodb自动加的
不同事务修改不同的行,会拿不同行的行级排他锁,但是都会拿一个表的排他锁,实际上innodb的表级排他锁不会冲突

悲观锁和乐观锁

悲观锁:先锁再操作
乐观锁:先查询再修改,更新的时候比较当前版本号和查询出来的版本号是否一致。如果一致则入库并将版本号+1,如果不一致则重新查询再次更新。

死锁

场景:
事务A:

select * from table where id=1 for update;

事务B:

select * from table where id=2 for update;

事务A:

select * from table where id=2 for update;
//卡住

事务B:

select * from table where id=1 for update;
//卡住
发布了347 篇原创文章 · 获赞 24 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/lbh199466/article/details/104787696