MySql锁的基本介绍
- 锁是计算机协调多个进程或线程并发访问某个资源的机制
- 不同存储引擎支持不同的锁机制
- 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最大,并发度最低。适合于以查询为主
- 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度最高。适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用 MylSAM表锁
- MySQL的表级锁有两种模式:表共享读锁和表独占写锁
- 写阻塞读、写
- 读阻塞写
- 读和写是串行的,可以通过变量concurrent_insert控制,允许一个进程读表的同时,另一个进程从表尾插入记录 InnoDB锁
- 事务及其ACID属性
- 原子性:事务是一个原子操作单元,其对数据的修改,要么全部执行,要么全部不执行
- 一致性:在事务开始和完成时,数据都必须保持一致状态
- 隔离性:数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行。
- 持久性:事务完成之后,它对数据的修改时永久性的,即使出现系统故障也能够保持
- 并发事务带来的问题
- 并发事务处理能大大增大数据库资源利用率,提高事务吞吐量,从而支持更多用户的并发操作,与此同时,会带来以下问题:
- 脏读
- 不可重复读
- 幻读
- 上诉问题都是数据库读一致性的问题,可以通过事务的隔离机制进行保证
- read uncommitted
- read committed
- repeatable read(默认的隔离级别)
- serializable
- InnoDB的行锁模式及加锁方式
- 共享锁
- 排他锁
- InnoDB行锁实现方式
- InnoDB行锁时通过给索引上的索引项加锁来实现的,这意味这:只有通过索引条件查询时,innoDB才使用行级锁,否则将使用表锁
- 行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但如果是使用相同的索引建,是会出现冲突的