Mysql 锁

锁的类别


共享锁(读锁)
共享锁的代号是S,是Share的缩写,共享锁的锁粒度是行或者元组(多个行)。一个事务获取了共享锁之后,可以对锁定范围内的数据执行读操作,
事务T对数据A加了共享锁,其他事务只能再加共享锁,不能加排他说,获准共享锁的事务只能读取数据,不能修改数据。


排他锁 (写锁)

排它锁的代号是X,是eXclusive的缩写,排它锁的粒度与共享锁相同。一个事务获取了排它锁之后,可以对锁定范围内的数据执行写操作。
如果事务T对数据A加上排他锁后,则其他事务不能再对A加任何类型的锁,获准 排他锁的事务既能读数据,也能写数据。


意向锁

意向锁是一种表级锁,锁的粒度是整张表。分为意向共享锁(IS)和意向排他锁(IX)。
那么意向锁是从何而来的呢?
因为表锁覆盖了行锁的数据,所以表锁和行锁也会产成冲突。例如:

A、事务1:BEGIN
B、事务1给T1加上了X锁,修改表表结构(如alter table
C、事务2:BEGIN
D、事务2对T1的一行加S锁或者X锁(事务2会被阻塞,等待事务1释放锁,它才能加锁成功)


事务1要操作整张表,故锁住了整张表。那么事务2就不能对该表的单条记录或者元组加X锁或者S锁,去读取或者修改记录。


为了方便地检测表级锁和行级锁之间的冲突,于是引入了意向锁。


采用了意向锁之后,上述的例子就变成:
A:事务1:BEGIN
B:事务1给T1加X锁,修改表结构
C:事务2:BEGIN
D:事务2给T1加上IX锁(事务被阻塞,等待加锁成功)
E:事务2给T1加上S锁或者X锁,成功

意向锁为了方便检测表级锁和行级锁之间的冲突,故在给一行记录加锁前,首先给该表加意向锁,意向锁同时只能有一个。也就是同时加意向锁和行级锁。

上面提到的共享锁、排它锁、意向共享锁、意向排它锁相互之前都是有兼容/互斥关系的,可以用一个兼容性矩阵表示(y表示兼容,n表示不兼容):
    X    S    IX    IS
X  n     n    n     n
S  n     y    n     y
IX n     n    y     y
IS n     y    y     y  


记录锁

锁直接加在索引记录上面。

如:update TABLE  set   COLUMN = 'xxx' WHERE ID = '1111',  锁住ID为 1111的记录 


间隙锁

锁加在不存在的空闲空间,可以是两个索引记录之间,也可能是第一个索引记录之前或最后一个索引之后的空间。

如:update TABLE  set   COLUMN = 'xxx' WHERE ID > '1111', 锁住ID大于1111的记录,哪怕记录为空



乐观锁

假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。

实现:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。

缺点:数据库性能的大量开销,尤其是长事务处理时



悲观锁

假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。

实现:MVCC 基于数据库多版本实现,增加隐藏版本号 或者 时间戳字段

缺点:无法解决脏读问题;



锁的级别


表级锁定(table-level)

MySQL各存储引擎中最大颗粒度的锁定机制,即锁定整张表

好处:实现逻辑简单、获取锁和释放锁的速度很快、规避死锁问题

缺点:锁定资源争用的概率也会最高,并发效率差

引擎:MyISAM,MEMORY,CSV等一些非事务性存储引擎


行级锁定(row-level)

行级锁定最大的特点就是锁定对象的颗粒度很小,即锁定一行或者多行,锁定资源争用的概率也最小.
好处:解决并发问题、事务问题、
缺点:获取锁和释放锁的开销大、容易死锁
引擎:InnoDB存储引擎

页级锁定(page-level)

各方面表现介于表级锁和行级锁之间
引擎:BerkeleyDB存储引擎


存储引擎


MyISAM

 mysql5.5之前版本的默认引擎使用表级锁每个MyISAM在磁盘上存储成3个文件,其中文件名和表名都相同,但是扩展名分别为:

  • .frm(存储表定义)
  • MYD(MYData,存储数据)
  • MYI(MYIndex,存储索引)

优点:占用空间小,处理速度快,SELECT、INSERT 为主的应用
缺点:不支持事务的完整性和并发性

使用:
1.选择密集型的表。MyISAM存储引擎在筛选大量数据时非常迅速,这是它最突出的优点。
2.插入密集型的表。MyISAM的并发插入特性允许同时选择和插入数据。例如:MyISAM存储引擎很适合管理邮件或Web服务器日志数据。


InnoDB

mysql5.5及之后版本的默认引擎,使用行级锁。InnoDB中,创建的表的表结构存储在.frm文件中(我觉得是frame的缩写吧)。
数据和索引 存储在innodb_data_home_dir和innodb_data_file_path定义的表空间中。

优点:事务处理回滚崩溃修复能力多版本并发控制的事务安全、外检、AUTO_INCREMENT
缺点:锁开销大,容易产生死锁


使用场景:
1.更新密集的表。InnoDB存储引擎特别适合处理多重并发的更新请求。
2.事务。InnoDB存储引擎是支持事务的标准MySQL存储引擎。
3.自动灾难恢复。与其它存储引擎不同,InnoDB表能够自动从灾难中恢复。
4.外键约束。MySQL支持外键的存储引擎只有InnoDB。
5.支持自动增加列AUTO_INCREMENT属性。

MEMORY

使用MySQL Memory存储引擎的出发点是速度。为得到最快的响应时间,采用的逻辑存储介质是系统内存。

优点:存储表数据确实会提供很高的性能,快
缺点:但当mysqld守护进程崩溃时,所有的Memory数据都会丢失

使用场景:

1.目标数据较小,而且被非常频繁地访问。在内存中存放数据,所以会造成内存的使用,可以通过参数max_heap_table_size控制Memory表

的大小,设置此参数,就可以限制Memory表的最大大小。

2.如果数据是临时的,而且要求必须立即可用,那么就可以存放在内存表中。

3.存储在Memory表中的数据如果突然丢失,不会对应用服务产生实质的负面影响。











评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值