mysql数据库表锁行锁
Posted yuec1998
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql数据库表锁行锁相关的知识,希望对你有一定的参考价值。
mysql有2种常见的锁:表锁和行锁
一、表锁
1)读锁
·假如当前有2个session,session1获得表table的读锁,对表table进行查询,并尚未释放读锁,因为读锁是读共享锁,所以此时session2也是可以对table进行读操作。
·若此时session1对table进行写操作,那么会报错提醒尚未释放表锁,并且session1也不可以在没释放表锁的前提下,去CEUD其他表。
·那么,倘若session2在此时对table进行了写操作,此时并不会报错,而是线程阻塞,等待session1解锁。
2)写锁
·假如当前有2个session,session1获得表table的写锁,此时session可以对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是在数据库中上锁用的,可以为数据库中的行上一个排它锁。当一个事务的操作未完成时候,其他事务可以读取但是不能写入或更新。
以上是关于mysql数据库表锁行锁的主要内容,如果未能解决你的问题,请参考以下文章