mysql中innoDB锁有什么主要作用

  

下文给大家带来有关mysql中innoDB锁有什么主要作用内容,相信大家一定看过类似的文章。我们给大家带来的有何不同呢?一起来看看正文部分吧,相信看完mysql中innoDB锁有什么主要作用你一定会有所收获。

在innoDB加锁前,为什么要先开始事务

innoDB下锁的释放在事务提交/回滚之后,事务一旦提交/回滚之后,就会自动释放事务中的锁,innoDB默认情况下autocommit=1即开启自动提交

检索条件使用索引和不使用索引的锁区别:

检索条件有索引的情况下会锁定特定的一些行。

检索条件没有使用使用的情况下会进行全表扫描,从而锁定全部的行(包括不存在的记录)

读锁:

读锁是共享的,或者说是相互不阻塞的。多个用户在同一时刻可以同时读取同一个资源,而互不干扰。

写锁:

写锁是排他的,也就是说一个写锁会阻塞其他的写锁和读锁。另外写锁比读锁有更高的优先级,因此一个写锁请求可能会被插入到读锁队列的前面,但是读锁则不肯能插入到写锁的前面

表锁:

innoDB还有两个表锁:意向共享锁(是),意向排它锁(IX)

行锁:

innoDB实现了两种类型额行级锁,共享锁和排它锁

 mysql中innoDB锁有什么主要作用“> </p> <h3>乐观锁:</h3> <p>乐观锁,也叫乐观并发控制,它假设多用户并发的事务在处理时不会彼此互相影响,各事务能够在不产生锁的情况下处理各自影响的那部分数据。在提交数据更新之前,每个事务会先检查在该事务读取数据后,有没有其他事务又修改了该数据。如果其他事务有更新的话,那么当前正在提交的事务会进行回滚。</p> <h3>悲观锁:</h3> <p>悲观锁,也叫悲观并发控制,当事务一个对某行数据应用了锁,并且当这个事务把锁释放后,其他事务才能够执行与该锁冲突的操作,这里事务一所施加的锁就叫悲观锁。享锁和排他锁(行锁,间隙锁,锁键)都属于悲观锁</p> <h3>悲观锁与乐观锁的实现方式:</h3> <p>悲观锁的实现依靠的是数据库提供的锁机制来实现,例如select *从消息id=12更新,而乐观锁依靠的是记录数据版本来实现,即通过在表中添加版本号字段来作为是否可以成功提交的关键因素。</p> <p> <img src=

  • 对于select 语句,innodb不会加任何锁,也就是可以多个并发去进行select的操作,不会有任何的锁冲突,因为根本没有锁。

  • 对于insert,update,delete操作,innodb会自动给涉及到的数据加排他锁,只有查询select需要我们手动设置排他锁。

  • 意向共享锁(IS):

      通知数据库接下来需要施加什么锁并对表加锁。如果需要对记录A加共享锁,那么此时innodb会先找到这张表,对该表加意向共享锁之后,再对记录A添加共享锁。也就是说一个数据行加共享锁前必须先取得该表的IS锁

    意向排它锁(IX):

      通知数据库接下来需要施加什么锁并对表加锁。如果需要对记录A加排他锁,那么此时innodb会先找到这张表,对该表加意向排他锁之后,再对记录A添加共享锁。也就是说一个数据行加排它锁前必须先取得该表的IX锁

      共享锁和意向共享锁,排他锁与意向排他锁的区别:
    • 共享锁和排他锁,系统在特定的条件下会自动添加共享锁或者排他锁,也可以手动添加共享锁或者排他锁。

    • 意向共享锁和意向排他锁都是系统自动添加和自动释放的,整个过程无需人工干预。

    • 共享锁和排他锁都是锁的行记录,意向共享锁和意向排他锁锁定的是表。

    锁的实现方式:

      在MySQL中,行级锁并不是直接锁记录,而是锁索引。索引分为主键索引和非主键索引两种,如果一条sql语句操作了主键索引,MySQL就会锁定这条主键索引;如果一条语句操作了非主键索引,MySQL会先锁定该非主键索引,再锁定相关的主键索引。

    mysql中innoDB锁有什么主要作用