MySQL——InnoDB锁问题(一) - Go语言中文社区

MySQL——InnoDB锁问题(一)


InnoDB和MyISAM最大的不同有两点,(1)、支持事务处理;(2)、采用行级锁;

行级锁与表级锁本省有很大的不同,同时,引入事务处理后,也带来了新的问题。下面详细讲解InnoDB行级锁。

(一)、背景知识;

(1)、事务及其特性。

事务是由一组SQL语句组成的逻辑单元,事务具有以下四个特性。

a、原子性:事务是一个原子操作单元,要么都执行成功,要么都执行失败。

b、一致性:在事务开始和完成时,数据都必须保持一致性状态,这意味着所有相关的数据都必须应用于事务的修改,以保持数据的完整性;事务结束后,所有的内部数据结构都必须是正确的。

c、隔离性:数据库系统提供一定的隔离机制,保证事务不受外部并发操作影响“独立的”执行环境。也就是处理中的中间状态外部都是不可见的。反之亦然。

d、持久性:数据修改完成后,对数据的修改是永久性的,即使系统出现故障,数据依然能够保持。

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

相对串行处理来说,并发事务处理能力大大增加数据库资源的利用率,提高数据库系统事务的吞吐量,从而可以支持更多的用户,但是并发事务处理会带来一些问题。主要如下:

(a)、更新丢失:当两个事务或者多个事务选择同一行,然后基于选定的值更新该行时,由于每个事务都不知道其他事务的存在,就会发生数据更新丢失。最后的更新覆盖了其他事务所做的更新。

(b)、脏读:一个事务正在对一条数据进行修改,在这个事务完成并提交事务之前,这条记录的数据就处于不一致的状态;这时,另一个事务又来读取这条数据,如果不加控制,第二个事务就会读取到这些“脏”数据。并据此做一定的处理,就会产生未提交的数据依赖关系,这种现象就叫脏读。

(c)、不可重复读:一个事务正在读取某些数据后的某个时间段,再次读取以前读取到的数据,却发现以前读出的数据已经发生了改变或者这些记录已经被删除!这叫不可重复读。

(d)、幻读:一个事务按相同的查询条件重新读取以前检索过的数据,却发现了其他事务插入了满足其查询条件的新数据,这样的现象叫幻读。

(3)、事务隔离级别。

一般事务隔离的方式有两种:a、一种在读取数据之前,对其进行加锁,阻止其他事务对数据进行修改。

    b、不用加任何锁,通过一定的机制生成数据请求时间点的一致性快照,并用这个快照来提供一定级别的一致性读取。从用户的角度来看,好像是数据库可以提供同一数据的多个版本。简称MVCC。

为了解决隔离和并发的矛盾,ISO/ANSI SQL92定义了4个事务隔离级别,每个级别的隔离程度不同。



版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/spring_model/article/details/54016799
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-07 19:54:05
  • 阅读 ( 656 )
  • 分类:数据库

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢