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;
//卡住