1,数据库锁理论概述
分类: 读锁、写锁。
行锁,表锁,页锁。
1.1 表锁:无死锁,加锁快
加锁:lock tables 表名 read(write)
释放锁: unlock tables;
查看锁: show open tables
读锁 -》共享锁 1,自己可以读,2,别人可以读 3,不可以更新 4,不可以读其他表
写锁-》独占锁 1,自己可以读,2,别人不可以读,不可以更新 3,可以更新 4,不可以读其他表
myisam 在执行select 之前,会自动给涉及的表加读锁,在执行增删改之前,会自动给涉及的表加写锁。
分析表锁:
通过 table_locks_waited和table_locks_immediate变量分析表锁定
查看 show status like '%table%'
table_locks_immediate:产生表级锁定的次数,表示可以立即获取锁的查询次数,每立即获取锁值加一。
table_locks_waited:出现表级锁定争用而发生等待的次数(不能立即获取锁的次数,每等待一次值加一),此值高则说明存在着严重的表级锁争用情况。
另外,myisam读写锁调度是写优先,这也是myisam不适合做写为主表的引擎的原因。因为写锁后,其他线程不能做任何操作,大量查询会使查询很难得到锁,从而造成永久阻塞。
1.2 行锁
偏向Innodb存储引擎,开销大,加锁慢,会出现死锁。锁定粒度最小,发生所冲突的概率最低,并发度最高。
Innodb与myISAm的最大不同有两点:1,支持事务 2,采用行级锁
语法: 1,通过索引项加锁 2,通过select **** for update加锁 ,锁定某一行后,其他操作会被阻塞,知道锁定行的会话commit。
InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的。
1)InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁
2)在不通过索引条件查询的时候,InnoDB确实使用的是表锁,而不是行锁
3)有了索引以后,在对索引字段查询时,使用的就是行级锁,如果是使用相同的索引键值,是会出现锁冲突的
4)当表有多个索引的时候,不同的事务可以使用不同的索引锁定不同的行
1.3 间隙锁
当我们用范围条件而不是相等条件检索数据(并请求共享或排他锁时),InnoDB会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录,叫做“间隙(GAP)”,InnoDB也会对这个“间隙”加锁,这种锁机制就是所谓的间隙锁(Next-Key锁)
分析行锁:
查看 show status like 'innodb_row_lock%'
innodb_row_lock_current_waits 当前正在等待锁定的数量
innodb_row_lock_time 从系统启动到现在锁定总时间长度
innodb_row_lock_time_avg 每次等待所花费平均时间
innodb_row_lock_time_max 从系统启动到现在等待最长的一次花费的时间
innodb_row_lock_waits 从系统启动到现在总共等待的次数
网友评论