MySQL基础

1.MySQL的逻辑架构

在这里插入图片描述

2.并发控制

并发控制存在于MySQL的两个层面中:服务器层以及存储引擎层。

2.1 读写锁

共享锁(读锁)是共享的,或者说是相互不堵塞的。多个客户在同一时刻可以同时读取同一个资源而互不干扰。排他锁(写锁)是互斥的,也就是说一个写锁会阻塞其他的写锁和读锁。

2.2 锁粒度

一种提高共享资源并发性的方式是让锁定对象更有选择性。尽量只锁定需要修改的部分数据,而不是所有的资源。任何时候,在给定的资源上,锁定的数据越少,则系统的并发程度就越高。
常见的锁粒度包括表锁以及行锁。表锁会锁定整张表,行锁同理。行级锁只会在存储引擎层实现,而MySQL服务器层则没有实现。
当然,每一种MySQL存储引擎都可以实现自己的锁策略和锁粒度。将锁粒度固定在某个级别,可以为某些特定的应用场景提供更好的性能,但却会失去对另外一些应用场景的良好支持。好在MySQL支持多个存储引擎的架构,所以不需要单一的通用解决方案。

3.事务

事务就是一组原子性的SQL查询,或者说是一个独立的工作单元。事务内的语句,要么全部执行,要么全部执行失败。
可以用start transaction语句开始一个事务,然后要么使用commit提交事务将修改的数据持久保留,要么使用rollback撤销所有的修改。
系统需要严格的ACID测试保证事务的概念性(原子性、一致性、隔离性以及持久性)。这也正式MySQL的存储引擎架构可以发挥优势的地方。用户可以根据业务是否需要事务处理去选择何使的存储引擎。

3.1 隔离级别

下面简单介绍四种隔离级别:
1.read uncommited(未提交读)
事务中的修改,即使没有提交,对其他事务也都是可见的。事务可以读取未提交的数据,这称之为脏读。
2.read commited(提交读)
一个事务开始时,只能看见已经提交的事务所做的修改,换句话说,一个事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的。
3.repeatable read(可重复读)
该级别保证了在同一个事务中多次读取同样的记录的结果是一致的。但是会出现幻读的问题。所谓幻读假如把事务的隔离级别设置为“可重复读”,当一个读事务按条件查询时,行锁仅仅加在了符合条件的记录行上,此时其他写事务,虽然不能操作加有行锁的记录行,但是完全可以操作其他数据行,甚至是新增一条新纪录行。所以如果在读事务的过程中,写事务新增了一条符合条件的记录,那么读事务再次查询时,就会查询到上次查询时没有查到的新纪录;就出现了幻读。(悲观锁无法锁住insert语句)
可重复读是MySQL的默认事务隔离级别。
4.serializable(可串行化)
serializable是最高的隔离级别,它通过强制事务串行执行,避免了前面所说的幻读的问题,其会在读取的每一行数据上都加锁,所以可能会导致大量的超时以及锁争用的问题。实际应用中也很少用到这个隔离级别,只有在非常需要确保数据的一致性而且没有并发的时候,才考虑该级别。
总结一下,数据库的隔离级别中,“提交读”解决了脏读;“可重复读”不仅解决了脏读,还解决了不可重复读;它们的原理都是通过给数据行加锁(共享读锁和排他写锁)来完成的。

3.2 死锁

死锁是指两个或者多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。
为了解决这个问题,数据库系统实现了各种死锁检测和死锁超时机制,InnoDB目前的处理死锁的方法是,将持有最少行级排他锁的事务进行回滚。

3.3 事务日志

存储引擎在修改表的数据时只需要修改其内存拷贝,再把该修改行为记录到持久在硬盘上的事务日志中,而不用每次都将修改的数据本身持久到硬盘。
写日志的操作是硬盘上一小块区域内的顺序I/O,而不像随机I/O需要在磁盘的多个地方移动磁头,所以采用事务日志的方式相对来说快很多。内存中被修改的数据在后台可以慢慢地刷回到硬盘。

3.4 MySQL中的事务

MySQL默认采用自动提交(autocommit)的模式,也就是说,如果不显示地开启一个事务,则每个查询都被当作一个事务执行提交操作。
注意,某些非事务型的表上的变更不能被回滚!

4.多版本并发控制

MySQL的大多数事务型存储引擎实现的都不是简单的行级锁,其都实现了多版本并发控制(MVCC),其是通过保存数据在某个时间点的快照来实现的。典型的实现方式包括乐观并发控制以及悲观并发控制。
InnoDB的MVCC是通过在每行记录后面保存两个隐藏的列来实现的。这两个列一个是行的创建时间,一个是行的过期时间。
我们来看一下InnoDB-MVCC的具体操作过程:
SELECT: 只查找创建时间早于当前事务版本的数据行,这样可以保证事务读取的行实在事务开始前已经存在的。删除版本未定义或者大于当前事务版本号,保证事务读取的行没有被删除。
INSERT: 为插入的每一行保存当前系统版本号为创建时间。
DELETE: 为删除的每一行保存当前系统版本号为删除时间。
UPDATE: 为更新的每一行保存当前系统版本号为创建时间

5.MySQL的存储引擎

MyISAM: 拥有较高的插入,查询速度,但不支持事务
InnoDB :5.5版本后Mysql的默认数据库,事务型数据库的首选引擎,支持ACID事务,支持行级锁定

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值