mysql有2种常见的锁:表锁和行锁

一、表锁

1)读锁

假如当前有2个session,session1获得表table的读锁,对表table进行查询,并尚未释放读锁,因为读锁是读共享锁,所以此时session2也是可以对table进行读操作。
若此时session1对table进行写操作,那么会报错提醒尚未释放表锁,并且session1也不可以在没释放表锁的前提下,去CEUD其他表。
那么,倘若session2在此时对table进行了写操作,此时并不会报错,而是线程阻塞,等待session1解锁。

2)写锁

假如当前有2个session,session1获得表table的写锁,此时session1可以对table进行读写操作,但是session1不能在没释放表锁的情况下去CRUD其他表。
此时的session2如果对table进行读写,线程会阻塞,等待session1锁释放

mysiam是表锁,从上方结论也可以看出表锁并不适合在高并发下数据的频繁写操作,因此mysql默认的存储引擎是innodb

二、行锁

并发事务处理带来的问题:更新丢失,脏读,不可重读,幻读。
在这里插入图片描述
1、索引失效全表扫描,行锁变表锁
2、间隙锁的危害

当用范围条件而不是相等条件检索数据,并请求共享或排他锁时,innodb会给符合条件的已有数据记录的索引项枷锁;对于键值在条件范围内但不存在的记录,叫做间隙GAP,innodb也会对这个间隙加锁,这种机制就是所谓的间隙锁next-key

排他锁:select * from table_name where … for update;
for update是在数据库中上锁用的,可以为数据库中的行上一个排它锁。当一个事务的操作未完成时候,其他事务可以读取但是不能写入或更新。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐