【MySQL锁之】InnoDB存储引擎及其锁机制

首先要解决的一个误区就是:InnoDB存储引擎是基于事务的。而前面博文所讲的MyISAM存储引擎是不支持事务的。那么什么是基于事务的呢?复制过来一段我觉得讲得还不错的话:

在默认的情况下,MySQL从自动提交(autocommit)模式运行,这种模式会在每条语句执行完毕后把它作出的修改立刻提交给数据库并使之永久化。事实上,这相当于把每一条语句都隐含地当做一个事务来执行。如果你想明确地执行事务,需要禁用自动提交模式并告诉MySQL你想让它在何时提交或回滚有关的修改。执行事务的常用办法是发出一条START TRANSACTION(或BEGIN)语句挂起自动提交模式,然后执行构成本次事务的各条语句,最后用一条COMMIT语句结束事务并把它们作出的修改永久性地记入数据库。万一在事务过程中发生错误,用一条ROLLBACK语句撤销事务并把数据库恢复到事务开始之前的状态。START TRANSACTION语句"挂起"自动提交模式的含义是:在事务被提交或回滚之后,该模式将恢复到开始本次事务的START TRANSACTION语句被执行之前的状态。(如果自动提交模式原来是激活的,结束事务将让你回到自动提交模式;如果它原来是禁用的,结束当前事务将开始下一个事务。)如果是autocommit模式  autocommit的值应该为 1;请在试验前 确定autocommit 的模式是否开启 

1、事务及其ACID属性

原子性,隔离性,持久性,一致性

2、并发事务处理带来的问题

更新丢失:一个事物覆盖了另一个事务的更新

脏读:一个事物读到了另一个事务未提交的数据。

不可重复读:一个事物的两次读期间,另一个事务改变了值

幻读:一个事物两次读期间,另一个事务插入新的数据。

3、事物的隔离级别

脏读,不可重复读,幻读都是数据库读一致性问题,必须由数据库提供一种事务隔离机制来解决。数据库实现事务隔离的方式,有两种:

一种是在读取数据前,对其加锁,阻止其他事务对数据进行修改。

一种是不加锁,通过生成一个数据请求时间点的一致性数据快照,并用这个快照来提供一定级别的一致性读取。这种技术叫做数据多版本并发控制,也经常成为多版本数据库(MVCC)

未提交读,已提交读,可重复读,可序列化

4、InnoDB的行锁模式及其加锁方法

InnoDB中有以下两种类型的行锁:共享锁和排他锁。

对于update,insert,delete语句,InnoDB会自动给设计的数据集加排他锁。对于普通的select语句,InnoDB不会加任何锁。

事物可以通过以下语句显示给记录集加共享锁和排他锁。

共享锁:select * from 。。。。。 lock in share mode

排它锁:select * from .......... for update


5、InnoDB行锁的实现方式

InnoDB行锁是通过给索引上的索引项加锁来实现的,如果没有索引,InnoDB将通过隐藏的聚簇索引来对记录加锁。InnoDB这种行锁实现特点意味着:如果不通过索引条件检索数据,那么InnoDB将对表中的所有记录加锁,实际效果跟表锁一样。

(1)在不通过索引条件查询时,InnoDB会锁定表中的所有记录。

(2)Mysql的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但是如果使用相同的索引键,是会出现冲突的。


(3)当表有多个索引的时候,不同的事务可以使用不同的索引锁定不同的行,但都是通过行锁来对数据加锁。


(4)Next-key锁(间隙锁)

可以防止幻读和满足恢复和复制的需要



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值