For investors
股价:
5.36 美元 %For investors
股价:
5.36 美元 %认真做教育 专心促就业
MySQL数据库随着互联网的不断发展而被广泛应用到不同软件开发项目之中,而本文我们就通过案例分析来简单了解一下,MySQL有哪些锁。
按锁粒度分类,有行级锁、表级锁和页级锁。
行级锁是mysql中锁定粒度细的一种锁。表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突,其加锁粒度小,但加锁的开销也大。行级锁的类型主要有三类:
RecordLock,记录锁,也就是仅仅把一条记录锁上;
GapLock,间隙锁,锁定一个范围,但是不包含记录本身;
Next-KeyLock:RecordLock+GapLock的组合,锁定一个范围,并且锁定记录本身。
表级锁是mysql中锁定粒度大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分mysql引擎支持。常使用的MyISAM与InnoDB都支持表级锁定。
页级锁是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。因此,采取了折衷的页级锁,一次锁定相邻的一组记录。
按锁级别分类,有共享锁、排他锁和意向锁。
共享锁又称读锁,是读取操作创建的锁。其他用户可以并发读取数据,但任何事务都不能对数据进行修改(获取数据上的排他锁),直到已释放所有共享锁。
排他锁又称写锁、独占锁,如果事务T对数据A加上排他锁后,则其他事务不能再对A加任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。
意向锁是表级锁,其设计目的主要是为了在一个事务中揭示下一行将要被请求锁的类型。InnoDB中的两个表锁:
意向共享锁(IS):表示事务准备给数据行加入共享锁,也就是说一个数据行加共享锁前必须先取得该表的IS锁;
意向排他锁(IX):类似上面,表示事务准备给数据行加入排他锁,说明事务在一个数据行加排他锁前必须先取得该表的IX锁。
意向锁是InnoDB自动加的,不需要用户干预。
对于INSERT、UPDATE和DELETE,InnoDB会自动给涉及的数据加排他锁;对于一般的SELECT语句,InnoDB不会加任何锁,事务可以通过以下语句显式加共享锁或排他锁。
共享锁:SELECT…LOCKINSHAREMODE;
排他锁:SELECT…FORUPDATE;
MVCC实现原理?
MVCC(Multiversionconcurrencycontrol)就是同一份数据保留多版本的一种方式,进而实现并发控制。在查询的时候,通过readview和版本链找到对应版本的数据。
作用:提升并发性能。对于高并发场景,MVCC比行级锁开销更小。
MVCC实现原理如下:
MVCC的实现依赖于版本链,版本链是通过表的三个隐藏字段实现。
DB_TRX_ID:当前事务id,通过事务id的大小判断事务的时间顺序。
DB_ROLL_PTR:回滚指针,指向当前行记录的上一个版本,通过这个指针将数据的多个版本连接在一起构成undolog版本链。
DB_ROW_ID:主键,如果数据表没有主键,InnoDB会自动生成主键。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加抖音太原达内IT培训学习了解。