电子商务网站的建站目标,拥有自己的网站,电动汽车排名前十名,asp sql做学生信息网站文章目录 1. 事务1.1 概念1.2 事务操作1.2.1 未设置事务1.2.2 控制事务 1.3 事务四大特性1.4 并发事务问题1.5 事务隔离级别 2. 存储引擎2.1 MySQL体系结构2.2 存储引擎2.3 存储引擎的特点2.3.1 InnoDB2.3.2 MyISAM2.3.3 Memory2.3.4 区别和比较 1. 事务
1.1 概念
事务 是一组… 文章目录 1. 事务1.1 概念1.2 事务操作1.2.1 未设置事务1.2.2 控制事务 1.3 事务四大特性1.4 并发事务问题1.5 事务隔离级别 2. 存储引擎2.1 MySQL体系结构2.2 存储引擎2.3 存储引擎的特点2.3.1 InnoDB2.3.2 MyISAM2.3.3 Memory2.3.4 区别和比较 1. 事务
1.1 概念
事务 是一组操作的集合它是一个不可分割的工作单位事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求即这些操作要么同时成功要么同时失败。
就比如: 张三给李四转账1000块钱张三银行账户的钱减少1000而李四银行账户的钱要增加1000。 这一组操作就必须在一个事务的范围内要么都成功要么都失败。
正常情况: 转账这个操作, 需要分为以下这么三步来完成 , 三步完成之后, 张三减少1000, 而李四增加1000, 转账成功
异常情况: 转账这个操作, 也是分为以下这么三步来完成 , 在执行第三步是报错了, 这样就导致张三减少1000块钱, 而李四的金额没变, 这样就造成了数据的不一致, 就出现问题了。
为了解决上述的问题就需要通过数据的事务来完成我们只需要在业务逻辑执行之前开启事务执行完毕后提交事务。如果执行过程中报错则回滚事务把数据恢复到事务开始之前的状态。 注意 默认MySQL的事务是自动提交的也就是说当执行完一条DML语句时MySQL会立即隐式的提交事务。 1.2 事务操作
为了体现事务的特性我们重新建立一张账户管理的表数据如下
drop table if exists account;
create table account(id int primary key AUTO_INCREMENT comment ID,name varchar(10) comment 姓名,money double(10,2) comment 余额
) comment 账户表;
insert into account(name, money) VALUES (张三,2000), (李四,2000);1.2.1 未设置事务
首先我们最开始张三和李四的金额都是2000然后我们一次性执行下面的语句
-- 1. 查询张三余额
select * from account where name 张三;
-- 2. 张三的余额减少1000
update account set money money - 1000 where name 张三;
你干嘛~...
-- 3. 李四的余额增加1000
update account set money money 1000 where name 李四;上述语句中的第5行不符合语法规范执行肯定会报错这个时候我们再查看数据库中的数据查询如下 可以看到张三的钱减少了但是李四的前也没有增加这就是一个错误的操作。
1.2.2 控制事务
控制事务的语句如下 查看/设置事务提交方式 SELECT autocommit ;
SET autocommit 0 ;开始事务 START TRANSACTION 或 BEGIN ;提交事务 COMMIT;回滚事务 ROLLBACK注意上述的这种方式我们是修改了事务的自动提交行为, 把默认的自动提交修改为了手动提交, 此时我们执行的DML语句都不会提交, 需要手动的执行commit进行提交。 上面转账的语句加上了事务控制后如下所示
-- 开启事务
start transaction
-- 1. 查询张三余额
select * from account where name 张三;
-- 2. 张三的余额减少1000
update account set money money - 1000 where name 张三;
-- 3. 李四的余额增加1000
update account set money money 1000 where name 李四;
-- 如果正常执行完毕, 则提交事务
commit;
-- 如果执行过程中报错, 则回滚事务
-- rollback;1.3 事务四大特性
事务具有四大特性
原子性Atomicity事务是不可分割的最小操作单元要么全部成功要么全部失败。一致性Consistency事务完成时必须使所有的数据都保持一致状态。隔离性Isolation数据库系统提供的隔离机制保证事务在不受外部并发操作影响的独立环境下运行。持久性Durability事务一旦提交或回滚它对数据库中的数据的改变就是永久的。
上述就是事务的四大特性简称ACID
1.4 并发事务问题 脏读 指一个事务读到另外一个事务还没有提交的数据。 比如上面的B读取到了A未提交的数据。 不可重复读 指一个事务先后读取同一条记录但两次读取的数据不同称之为不可重复读。 事务A两次读取同一条记录但是读取到的数据却是不一样的。 幻读 指一个事务按照条件查询数据时没有对应的数据行但是在插入数据时又发现这行数据已经存在好像出现了 “幻影”。
1.5 事务隔离级别
为了解决并发事务所引发的问题在数据库中引入了事务隔离级别。主要有以下几种
隔离级别脏读不可重复读幻读Read uncommited ✓ \checkmark ✓ ✓ \checkmark ✓ ✓ \checkmark ✓Read commited× ✓ \checkmark ✓ ✓ \checkmark ✓Repeatable Read(默认)×× ✓ \checkmark ✓Serializable××× 查看事务隔离级别 SELECT TRANSACTION_ISOLATION;设置事务隔离级别 SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }注意事务隔离级别越高数据越安全但是性能越低。 2. 存储引擎
2.1 MySQL体系结构
MySQL的体系结构可以分为客户层、服务层、存储引擎层、物理层四个方面其结构如下 客户层 最上层是一些客户端和链接服务包含本地sock 通信和大多数基于客户端/服务端工具实现的类似于TCP/IP的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于SSL的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。 服务层 第二层架构主要完成大多数的核心服务功能如SQL接口并完成缓存的查询SQL的分析和优化部分内置函数的执行。所有跨存储引擎的功能也在这一层实现如 过程、函数等。在该层服务器会解析查询并创建相应的内部解析树并对其完成相应的优化如确定表的查询的顺序是否利用索引等最后生成相应的执行操作。如果是select语句服务器还会查询内部的缓存如果缓存空间足够大这样在解决大量读操作的环境中能够很好的提升系统的性能。 存储引擎层 存储引擎层 存储引擎真正的负责了MySQL中数据的存储和提取服务器通过API和存储引擎进行通信。不同的存储引擎具有不同的功能这样我们可以根据自己的需要来选取合适的存储引擎。数据库中的索引是在存储引擎层实现的。 物理层 主要是将数据(如: redolog、undolog、数据、索引、二进制日志、错误日志、查询日志、慢查询日志等)存储在文件系统之上并完成与存储引擎的交互。
2.2 存储引擎
存储引擎是mysql数据库的核心存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式 。存储引擎是基于表的而不是基于库的所以存储引擎也可被称为表类型。我们可以在创建表的时候来指定选择的存储引擎如果没有指定将自动选择默认的存储引擎。 建表时指定存储引擎 CREATE TABLE 表名(字段1 字段1类型 [ COMMENT 字段1注释 ] ,......字段n 字段n类型 [COMMENT 字段n注释 ]
) ENGINE INNODB [ COMMENT 表注释 ] ;只需要在建立的表的后面添加一个 ENGINE 的字段即可。 查询当前数据库支持的存储引擎 show engines;查询结果如下 可以看到上面支持的数据库引擎其 Support 一列标注为 YES 不支持的标注为 NO InnoDB 数据库引擎设置为是默认引擎。 创建其他引擎 以创建 MEEMORY 引擎为例创建的语句如下 create table my_memory(id int,name varchar(10)
) engine Memory ;2.3 存储引擎的特点
这里我们主要介绍三种引擎 InnoDB, MyISAM, Memory 的特点。
2.3.1 InnoDB 简单介绍 InnoDB是一种兼顾高可靠性和高性能的通用存储引擎在 MySQL 5.5 之后InnoDB是默认的 MySQL 存储引擎。 其特点如下 DML操作遵循ACID模型支持事务行级锁提高并发访问性能支持外键FOREIGN KEY约束保证数据的完整性和正确性 文件存储 InnoDB 引擎的每张表都会对应一个 ibd 表空间文件存储该表的表结构、数据和索引。 我们直接打开MySQL安装时的数据存放目录这个目录下有很多文件夹不同的文件夹代表不同的数据库我们直接打开study文件夹可以看到其中的文件目录如下 可以看到里面有很多的ibd文件每一个ibd文件就对应一张表比如我们有一张表 account就有这样的一个account.ibd文件而在这个ibd文件中不仅存放表结构、数据还会存放该表对应的索引信息。 而该文件是基于二进制存储的不能直接基于记事本打开我们可以使用mysql提供的一个指令 ibd2sdi 通过该指令就可以从ibd文件中提取sdi信息而sdi数据字典信息中就包含该表的表结构。 逻辑存储结构 InnoDB引擎中的逻辑结构最高层时表空间一个表空间中含有若干个段一个段中含有若干的区一个区包含若干个页一个页包含若干个行其关系如下 各个结构如下 表空间 : InnoDB存储引擎逻辑结构的最高层ibd文件其实就是表空间文件在表空间中可以包含多个Segment段。段 : 表空间是由各个段组成的 常见的段有数据段、索引段、回滚段等。InnoDB中对于段的管理都是引擎自身完成不需要人为对其控制一个段中包含多个区。区 : 区是表空间的单元结构每个区的大小为1M。 默认情况下 InnoDB存储引擎页大小为16K 即一个区中一共有64个连续的页。页 : 页是组成区的最小单元页也是InnoDB 存储引擎磁盘管理的最小单元每个页的大小默认为 16KB。为了保证页的连续性InnoDB 存储引擎每次从磁盘申请 4-5 个区。行 : InnoDB 存储引擎是面向行的也就是说数据是按行进行存放的在每一行中除了定义表时所指定的字段以外还包含两个隐藏字段(后面会详细介绍)。
2.3.2 MyISAM
MyISAM是MySQL早期的默认存储引擎。
其特点为
不支持事务不支持外键支持表锁不支持行锁访问速度快
MyISAM的表分为三个文件进行存储
.sdi存储表结构信息.MYD: 存储数据.MYI: 存储索引
2.3.3 Memory
Memory引擎的表数据时存储在内存中的由于受到硬件问题、或断电问题的影响只能将这些表作为临时表或缓存使用。
其存储采用的时hash索引。
存放的表的文件为 .sdi 存储表结构信息。
2.3.4 区别和比较
特点InnoDBMyISAMMemory存储限制64TB有有事务安全支持不支持不支持锁机制行锁表锁表锁B树索引支持支持支持Hash索引不支持不支持支持全文索引支持支持不支持空间使用高低内存使用高低中等批量插入速度低高高支持外键支持不支持不支持