Mysql的锁

总的来说,Mysql 的锁分为以下三种:

表级锁:计算简单,不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。不会出现死锁的原因在于所有的锁是同时获取的。

行级锁:计算复杂,会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

 页面锁:开销和加锁时间界于表锁和行锁之间,会出现死锁,锁定粒度界于表锁和行锁之间,并发度也界于两者之间。

常用的 Mysql 的两种引擎:MyISAM 和 Innodb最大的区别在于:1、是否支持事务,只有InnoDB支持,MyISAM不支持。2、MyISAM支持行锁和表锁,默认使用的是行锁。而MyISAM只支持行锁。事务本身带有锁的作用。

加锁的操作:

lock tables 表名 read/write;

解锁的操作:

unlock tables;

对于 MyISAM 存储引擎,MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁,这个过程并不需要用户干预。给MyISAM表显示加锁,一般是为了一定程度模拟事务操作,实现对某一时间点多个表的一致性读取。一旦显示的加了表锁之后,就只能显示的查询表锁,不能访问未加锁的表。在上锁过程中,必须锁定所有的表,及时同一张以别名的心事出现了多次,也必须锁定多次。

读写锁的优先级不同:一般来说,写锁的优先级比读锁要高。但是这是可以通过设置来改变的。通过low_priority 和 high_priority 属性来设置每条操作语句(update/insert[low_priority],[high_priority]),这时属性的设置只对该条操作有效,或者设置 low_priority_updates 选项,达到对整条连接有效,如果想一次对所有的连接有效,如要在启动时设置 low_priority_updates 选项。

总的来说,MyISAM引擎的读和写是串行的,有个concurrent_insert 的系统变量的值设置为0,1,2 可以用来控制。

通过 set global concurrent_insert = xx这种方式来改变缺省的行为。

 

查看数据表的引擎的操作:

show table status from 数据库名 where name = "数据表名"

 

测试记录(打开两个客户端连接数据库服务器):

对于InnoDb 引擎。(此时的实验条件为 concurrent_insert == 1 下进行)。

t1线程加读锁时,t2线程只能够查询,update和insert操作都被阻塞,知道t1线程解锁。而在加锁阶段,t1线程也只能进行查询操作,update 和 insert 操作都会报错。

 

t1 线程加写锁时,t2线程的任何操作都被阻塞不返回,t2操作的结果在t1解锁之后返回。而在加锁阶段,t1线程能够进行查询、更新、插入操作。

改变 concurrent_insert == 2 (set global concurrent_insert= 2;) 结果仍然一样?这一点好奇怪。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值