mysql的逻辑架构和事务

1.1 mysql逻辑架构

最上层的服务并不是mysql所独有的,大多数基于网络的客户端/服务器的工具或者服务都有类似的架构.比如连接处理、授权认证、安全等等。

第二层架构是mysql比较有意思的部分。大多数mysql的核心服务功能都在这一层,包括查询解析、分析、优化、缓存以及所有的内置函数(例如,日期、时间、数学和加密函数),所有跨存储引擎的功能都在这一层实现:存储过程、触发器、视图等。

第三层包含了存储引擎。存储引擎负责Mysql中数据的存储和提取。存储引擎API包含几十个底层函数,用于执行诸如“开始一个事务”或者“根据主键提取一行记录”等操作。但存储引擎不会去解析SQL,不同存储引擎之间也不会相互通信,而只是简单地响应上层服务器的请求。

1.1.2 执行

对于SELECT语句,在解析查询之前,服务器会先检查查询缓存,如果能够在其中找到对应的查询,服务器就不必再执行查询解析、优化和执行的整个过程,而是直接返回查询缓存中的结果集。

1.2 读写锁

共享锁(shared lock)和排它锁(exclusive lock).也叫读锁(read lock)和写锁(write lock);

读锁是共享的,或者说是相互不阻塞的.多个客户在同一时刻读取同一资源,互不干扰。写锁则是排他的,也就是说一个写锁或阻塞其他的写锁或读锁,这是出于安全策略的考虑,只有这样,才能确保在给定的时间里,只有一个用户能执行写入,并防止其他用户读取正在写入的同一资源。

1.3 事务

ACID表示原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)。一个运行良好的事务处理系统,必须具备这些标准特征。

原子性(atomicity):一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能执行其中的一部分操作,这就是事务的原子性。

一致性(consistency):数据库总是从一个一致性的状态转换到另外一个一致性的状态。在事务完成时,必须是所有数据都保持一致状态,如果事务成功则所有数据都变为新的状态,如果事务失败,则所有数据将处于开始之前的状态。

隔离性(isolation):通常来说,一个事务所做的修改在最终提交之前,对其他事务是不可见的。

持久性(durability):一旦事务提交,则其所做的修改就会永久保存到数据库中。即使系统奔溃,修改的数据也不会丢失。

1.3.1 隔离级别

在SQL标准中定义了四种隔离级别:

READ UNCOMMITTED(未提交读):在READ UNCOMMITTED 级别,事务中的修改,即使没有提交,对其他事务都是可见的。事务可以读取未提交的数据,这也被称为脏读(Dirty Read)。(一般实际中很少使用)

READ COMMITTED(提交读):一个事务从开始直到提交之前,所做的任何修改都对其他事务不可见的。大多数数据库系统的默认隔离级别都是在READ COMMITTED (mysql不是)。这个级别也叫不可重复读(nonrepeatable read),因为两次执行相同的查询,可能会得到不一样的结果。(可能第一次查到是一个事务提交之前的,第二次查到是这个事务提交之后修改的数据)

REPETABLE READ(可重复读):解决了脏读的问题。该级别保证了在同一事务中多次读取同样记录的结果是一致的。但是该隔离界别还是无法解决幻读(Phantom Read)的问题。幻读是指当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时会产生幻行(Phantom Row)。(是MYSQL默认事务隔离级别)

SERIALIZABLE(可串行化):是最高的隔离级别。他通过强制事务串行执行,避免了幻读的问题。简单来说,可串行化会在读取每一行数据加锁,所以可能导致大量的超时和锁争用的问题。(一般很少用到这个隔离级别,只有在非常需要确保数据的一致性而且可以接受没有并发的情况下,才考虑该隔离级别)

mysql 可以通过 set transaction isolation level命令来设置隔离级别.

1.3.2 死锁

死锁:是指两个或者多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象.当多个事务视图以不同的顺序锁定资源时,就可能会产生死锁.多个事务同时锁定同一个资源时,也会产生死锁。

死锁解决办法:只有外部因素接入才能解除死锁。比如kill掉执行的sql;死锁发生以后,只有部分或者完全回滚其中一个事务,才能打破死锁。

InnoDB目前处理死锁的方法是,将持有最少行级排它锁的事务进行回滚(这是相对比较简单的死锁回滚算法)。

InnoDB 也支持通过特定的语句进行显示锁定:

SELECT ... LOCK IN SHARE MODE

MYSQL 也支持 LOCK TABLES 和 UNLOCK TABESY 语句,这是在服务层实现的和引擎无关.

1.3.3 事务日志

事务日志可以帮助提高事务的效率。使用事务日志,存储引擎在修改的数据时只需要修改其内存拷贝,再把该修改行为记录到持久在硬盘上的事务日志中,而不用每次都将修改的数据本身持久到磁盘。

1.3.4 MYSQL中的事务

MYSQL提供了两种事务型的引擎:InnoDB和NDB Cluster。

mysql默认采用自动提交(autocommit)模式。

查看mysql事务提交模式:show variables like 'autocommit';

mysql> show variables like 'autocommit';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| autocommit | ON |

+---------------+-------+

1 row in set, 1 warning (0.01 sec)

1或on标识启动,0或off标识禁用

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值