1 Mysql锁机制
- 表锁:偏性MyISAM,开销小加锁块,锁定力度大,锁冲突的概率最高;
- 行锁:偏性InnoDB,开销大但锁冲突概率小;
- 间隙锁:在可重复读的隔离级别中存在,用于预防幻读的出现。
1.1 MyISAM表锁
当执行select语句时,默认对表执行表锁,当执行修改操作时,默认加写锁;
当一个连接获取一张表读锁时,其他连接和该连接都不能修改该表,且该连接不能读其他表;
当一个连接对表加上写锁时,该连接可以读写;其他连接不能读写;
读锁会阻塞写,写锁会阻塞读写;
表锁适合做读为主的数据库;
1.2 InnoDB行锁
行锁特点:开销大,加锁慢;可能出现死锁;锁冲突概率小,并发高;
并发事务带来的问题:
- 丢失更新:两个事务同时修改同一个数据,最后的事务修改会覆盖之前的修改;
- 脏读:读取了未提交的事务
- 不可重复读:在一个事务中,未提交之前看不到其他事务的修改,即使其他事务提交
- 幻读:两个查询数据发现行数多了或者少了(其他事务插入了数据)
针对并发事务的问题,有四个隔离级别
- 未提交读:最低的隔离