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