mysql锁定机制
标签(空格分隔): mysql 锁
mysql对于不同存储引擎支持不同的锁定机制,myisam和memory存储引擎采用的是表级锁;Innodb采用行级锁,也支持表级锁;BDB存储引擎采用的是页级锁同时也支持表级锁。
行级锁
最大特点是锁定对象的粒度很小,发生资源竞争的概率就比较小,故而能提高较大的并发处理能力。但也由于粒度小,容易导致获取锁和加锁耗费资源,加锁较慢,容易发生死锁。
行级锁包括两种:共享锁(S)和排他锁(X)
同时为了使得Innodb存储引擎能够共存行级锁和表级锁,在其中又引用了意向锁,故存在意向共享锁和意向排他锁。
- 共享锁(S):读锁,允许一个事物读一行数据时,阻止其它的事务读取相同数据的排他锁。
- 排他锁(X):写锁,允许获得排他锁的事物更新数据,阻止其它事务取得相同数据的共享锁和排他锁。
- 意向共享锁(IS):事务对数据行加行共享锁,事务在给一个数据行加共享锁前必须先获取该表的IS锁。
- 意向排他锁(IX):事务给数据行加行排他锁,事物在给一个数据行加排他锁前必须现货区该表的IX锁。
Innodb行级锁,支持事务处理,需要满足ACID特性:
- 原子性(Atomicity):要么事务中的语句都执行,要么都不执行
- 一致性(Consistency):事务开始和结束状态,数据都保持一致的状态,相关的事务数据规则必须应用于数据的修改。
- 隔离性(Isolation):事务不受外在并发数据的干扰。
- 持久性(Durability):事务结束后,对事务的处理是持久性的。
读取数据存在的问题
- 更新丢失:两个事物更新同一行数据,但是第二个事务中途失败退出,导致这两个修改都失败了,这时系统没有执行任何锁操作,因此并发事务没有被隔离。
- 脏读:一个事务读取了某行数据,但是另一个事物已经更新了这行数据
- 不可重复读:一个事务对某行数据重复读取两次,可能得到不同的结果,因为可能读取的过程中,另一个事务对该数据进行了更改。
- 幻读:进行读取操作时,第二次读取时出现了之前没有出现的数据,可能另一个事物进行了插入操作。
sql四个事务隔离级别
- 读未提交(read uncommitted)最低级别,以上情况均无法保证
- 读已提交(read committed)可避免脏读情况发生
- 可重复读(repeatable read)可避免脏读、不可重复读情况的发生 数据库的默认级别
- 可序列化(serializable)可避免脏读、不可重复读、虚读情况的发生
表级锁
该种机制的锁定对象最大,系统开销较小,可以很好的避免死锁的问题。但是锁定机制的粒度很大,容易导致资源争用,所冲突的概率很高,故并发度也很低。
表锁定分为2中类型:读锁定与写锁定
四种状态
- Current read lock queue(lock->read)当前持有读锁的所有线程
- Padding read lock queue(lock->read wait)等待读取资源的线程
- Current write lock queue(lock->write)当前持有写锁的所有线程
- Current write lock queue(lock->write wait)等待写取资源的线程
加锁方式:lock table_name read/write;
释放方式:unlock tables;
页级锁
该中机制的特点是颗粒度介于行级锁与表级锁之间,所以获取锁需要的资源开销和提供的并发处理能力也介于表级锁和行级锁之间。