MySQL之锁

什么是锁

锁时数据库系统区别于文件系统的一个关键特性。锁机制用于管理对共享资源的并发访问。

innodb使用锁的地方很多。例如,操作缓冲池中的LRU列表,删除、添加、移动LRU列表中的元素,为了保证一致性,必须有锁的介入。数据库系统使用锁为了支持对共享资源进行并发访问,提供数据的完整性和一致性。

对于myisam引擎,锁是表锁设计,并且不支持事务。

Lock和Latch

latch是一种轻量级锁,innodb中,latch可分为mutex(互斥量)和rwlock(读写锁)。目的是为了保证并发线程操作临界资源的正确性,并且通常没死锁检测机制。

lock的对象是事务,用来锁定的是数据库的对象,如表、页、行。并且lock的对象仅在事务commit或rollback后释放(不同事务隔离级别释放的时间可能不同)。lock是有死锁机制的。

-locklatch
对象事务线程
保护数据库内容内存数据结构
持续时间整个事务过程临界资源
模式行锁、表锁、意向锁读写锁、互斥量
死锁通过wait-for graph,time out等机制进行死锁的检测和处理无死锁检测和处理机制。仅通过应用程序加锁的顺序保证无死锁的情况发生
存在于lock manager的哈希表中每个数据结构的对象中

Innodb存储引擎中的锁

  • 共享锁,允许事务读一行数据
  • 排他锁,允许事务删除或更新一行数据

意向锁时将锁定的对象分为多个层次,意向锁意味着事务希望在更细力度上进行加锁。

将上锁对象看成一颗树,对最下层的对象(最细粒度)上锁,那么首先需要对粗粒度的对象上锁。

数据库A
    |--表1
        |--
           |--记录

如果需要对页上的记录r上排他锁,那么分别需要对数据库A、表、页上意向锁,最后对记录r上排他锁。若其中任何一部分导致等待,那么该操作需要等待粗粒度锁的完成。

例如,在对记录r加排它锁之前,已经有事务对表1进行共享表锁,那么表1上已经存在共享表锁,之后事务需要对记录r在的表1加意向锁,由于不兼容,所以该事务需要等待表锁操作完成。

有两种意向锁:

  • 意向共享锁,事务想获取表的某几行的共享锁
  • 意向排他锁,事务想获取表的某几行的排他锁

共享锁SQL语句
select * from t where a < 4 lock in share mode
排他锁SQL语句
select -- for update

一致性非锁定读

一致性读的非锁定读是指Innodb通过行多版本控制的方式来读取当前执行时间数据库中行的数据。

如果读取的行正在执行DELETE或UPDATE操作,这时读取操作不会因此去等待行上的锁释放。而是读取行的一个快照数据。

快照数据是指该行的之前版本的数据,是通过undo段来完成的(上节的事务实现中讲了)。

快照数据其实就是当前行数据之前的历史版本,有很多个版本,一般称这种技术为行多版本技术。由此带来的并发控制,称为多版本并发控制(MVCC)。

在隔离级别为读取提交和可重复读下,innodb采用非锁定的一至性读。在读取提交下,非一致性读总是读取被锁定行的最新一份快照数据。在可重复读下,非一直性读总是读取事务开始时的行数据版本。

注意:自增长值的列必须时索引,同时必须时索引的第一个列。
例如 a是自增长, KEY(a,b)不能使KEY(b,a)

锁的算法及锁问题

innodb有3中行锁的算法
1.单个行记录上的锁
2.间隙锁,锁定一个范围,但不包含记录本身
3.行锁+间隙锁,锁定一个范围,并且锁定记录本身

脏读
未提交的数据,如果读到了脏数据,即一个事务可以读到另一个事务中未提交的数据。

不可重复读
在一个事务内多次读取同一数据集合。在这个事务还没有结束时,另外一个事务页访问该同一数据集合,并做了一些DML操作。因此,在第一个事务中的两次读数据之间,由于第二个事务的修改,第一个事务两次读到的数据可能时不一样的。

脏读和不可重复读区别:脏读时读到未提交的数据,不可重复读是读到已经提交的数据。
通过行锁+间隙锁算法来避免不可重复读问题。
Read REPEATABLE,采用行锁+间隙锁。

丢失更新问题
事务A修改了r,但没提交,事务B修改了r,也没提交。
事务A先提交,事务B再提交。
由于加锁,所以导致B并不会更新,而是阻塞。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值