首页 > 其他分享 >08-存储引擎和事务

08-存储引擎和事务

时间:2023-07-30 22:15:14浏览次数:36  
标签:事务 tx 08 存储 引擎 提交 MySQL

08-存储引擎和事务

课程目标

掌握存储引擎的使用、常用的存储引擎、选择合适的存储引擎、 事务概述、事务的提交与回滚演示、自动提交模式、事务的隔离级别。

8.1存储引擎的使用

数据库中的各表均被(在创建表时)指定的存储引擎来处理。

服务器可用的引擎依赖于以下因素:

MySQL的版本

服务器在开发时如何被配置

启动选项

为了解当前服务器中有哪些存储引擎可用,可使用SHOW ENGINES语句,如下图8-1所示:

MySQL> show engines \G

图8-1

在创建表时,可使用engine选项为create table语句显式指定存储引擎。

create table tablename (no int) engine = MyISAM;

如果在创建表时没有显式指定存储引擎,则该表使用当前默认的存储引擎

默认的存储引擎可在my.ini配置文件中使用default-storage-engine选项指定。

现有表的存储引擎可使用alter table语句来改变:alter table tablename engine = INNODB;

为确定某表所使用的存储引擎,可以使用show create table或show table status语句:

MySQL> show create table emp\G

MySQL> show table status like 'emp' \G

8.2常用的存储引擎

1.MyISAM存储引擎

  • MyISAM存储引擎是MySQL最常用的引擎。
  • 它管理的表具有以下特征:
  • 使用三个文件表示每个表:
  • 格式文件 — 存储表结构的定义(mytable.frm)
  • 数据文件 — 存储表行的内容(mytable.MYD)
  • 索引文件 — 存储表上索引(mytable.MYI)
  • 灵活的AUTO_INCREMENT字段处理
  • 可被转换为压缩、只读表来节省空间

2.InnoDB存储引擎

InnoDB存储引擎是MySQL的缺省引擎。

它管理的表具有下列主要特征:

每个InnoDB表在数据库目录中以.frm格式文件表示

InnoDB表空间tablespace被用于存储表的内容

提供一组用来记录事务性活动的日志文件

用commit(提交)、savepoint及rollback (回滚)支持事务处理

    • 提供全ACID兼容
    • 在MySQL服务器崩溃后提供自动恢复
    • 多版本(MVCC)和行级锁定
    • 支持外键及引用的完整性,包括级联删除和更新

3. memory存储引擎

使用memory存储引擎的表,其数据存储在内存中,且行的长度固定,这两个特点使得memory存储引擎非常快。

memory存储引擎管理的表具有下列特征:

    • 在数据库目录内,每个表均以.frm格式的文件表示。
    • 表数据及索引被存储在内存中。
    • 表级锁机制。
    • 不能包含CLOB或BLOB字段。

memory存储引擎以前被称为HEAP引擎。

8.3 选择合适的存储引擎

MyISAM表最适合于大量的数据读而少量数据更新的混合操作。MyISAM表的另一种适用情形是使用压缩的只读表。

如果查询中包含较多的数据更新操作,应使用InnoDB。其行级锁机制和多版本的支持为数据读取和更新的混合操作提供了良好的并发机制。

可使用MEMORY存储引擎来存储非永久需要的数据,或者是能够从基于磁盘的表中重新生成的数据。

8.4 事务概述

日常生活中的一个典型事务,如下图8-2所示:

张三账户

金额:10000

李四账户

金额:

张三转账给李四,必须保证张三账户减少8000,李四账户增加8000,这两项操作必须全部成功,如何保证?需要事务

图8-2

事务可以保证多个操作原子性,要么全成功,要么全失败。对于数据库来说事务保证批量的DML要么全成功,要么全失败。事务具有四个特征ACID

原子性(Atomicity): 整个事务中的所有操作,必须作为一个单元全部完成(或全部取消)。

一致性(Consistency): 在事务开始之前与结束之后,数据库都保持一致状态。

隔离性(Isolation): 一个事务不会影响其他事务的运行。

持久性(Durability): 在事务完成以后,该事务对数据库所作的更改将持久地保存在数据库之中,并不会被回滚。

事务中存在一些概念:

  1. 事务(Transaction):一批操作(一组DML)
  2. 开启事务(Start Transaction)
  3. 回滚事务(rollback)
  4. 提交事务(commit)
  5. SET AUTOCOMMIT:禁用或启用事务的自动提交模式

当执行DML语句是其实就是开启一个事务

关于事务的回滚需要注意:只能回滚insert、delete和update语句,不能回滚select(回滚select没有任何意义),对于create、drop、alter这些无法回滚.

事务只对DML有效果。

注意:rollback,或者commit后事务就结束了。

8.5 事务的提交与回滚演示

1.创建表

create table user(

id int (11) primary key not null auto_increment ,
username varchar(30),

password varchar(30)

) engine=InnoDB default charset=utf8;

2.查询表中数据,如下图8-3所示:

图8-3

3.开启事务start transaction;

4.插入数据,如下图8-3所示:

insert into user(username,password) values('zhangsan','123');

图8-4

5.查看数据,如下图8-5所示:

图8-5

6.修改数据,如下图8-6所示:

图8-6

7.查看数据,如下图8-7所示:

图8-7

8.回滚事务,如下图8-8所示:

图8-8

9.查看数据,如下图8-9所示:

图8-9

8.6 自动提交模式

自动提交模式用于决定新事务如何及何时启动。

1.启用自动提交模式:

如果自动提交模式被启用,则单条DML语句将缺省地开始一个新的事务。

如果该语句执行成功,事务将自动提交,并永久地保存该语句的执行结果。

如果语句执行失败,事务将自动回滚,并取消该语句的结果。

在自动提交模式下,仍可使用start transaction语句来显式地启动事务。这时,一个事务仍可包含多条语句,直到这些语句被统一提交或回滚。

2.禁用自动提交模式:

如果禁用自动提交,事务可以跨越多条语句。

在这种情况下,事务可以用commit和rollback语句来显式地提交或回滚。

3.自动提交模式可以通过服务器变量autocommit来控制。

例如:

MySQL> set autocommit = OFF;

MySQL> set autocommit = ON;

MySQL> set session autocommit = OFF;

MySQL> set session autocommit = ON;

show variables like '%auto%'; -- 查看变量状态

8.7 事务的隔离级别1.隔离级别

事务的隔离级别决定了事务之间可见的级别。

当多个客户端并发地访问同一个表时,可能出现下面的一致性问题:

(1)脏读取(Dirty Read)

一个事务开始读取了某行数据,但是另外一个事务已经更新了此数据但没有能够及时提交,这就出现了脏读取。

(2)不可重复读(Non-repeatable Read)

在同一个事务中,同一个读操作对同一个数据的前后两次读取产生了不同的结果,这就是不可重复读。

(3)幻像读(Phantom Read)

幻像读是指在同一个事务中以前没有的行,由于其他事务的提交而出现的新行。

2.四个隔离级别

InnoDB 实现了四个隔离级别,用以控制事务所做的修改,并将修改通告至其它并发的事务.

(1)读未提交(read umcommitted)

允许一个事务可以看到其他事务未提交的修改。

(2)读已提交(read committed)

允许一个事务只能看到其他事务已经提交的修改,未提交的修改是不可见的。

(3)可重复读(repeatable read)

确保如果在一个事务中执行两次相同的select语句,都能得到相同的结果,不管其他事务是否提交这些修改。 (银行总账)

该隔离级别为InnoDB的缺省设置。

(4)串行化(serializable) 【序列化】

将一个事务与其他事务完全地隔离。

例: A可以开启事物,B也可以开启事物

A在事物中执行DML语句时,未提交

B不以执行DML,DQL语句

3.隔离级别与一致性问题的关系,如下表8-1所示:

表8-1

4.设置服务器缺省隔离级别

(1)通过修改配置文件设置

可以在my.ini文件中使用transaction-isolation选项来设置服务器的缺省事务隔离级别。

该选项值可以是:

READ-UNCOMMITTED

READ-COMMITTED

REPEATABLE-READ

SERIALIZABLE

例如:

[MySQLd]

transaction-isolation = READ-COMMITTED

(2)通过命令动态设置隔离级别

隔离级别也可以在运行的服务器中动态设置,应使用SET TRANSACTION ISOLATION LEVEL语句。

其语法模式为:

SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL <isolation-level>

其中的<isolation-level>可以是:

READ UNCOMMITTED

READ COMMITTED

REPEATABLE READ

SERIALIZABLE

例如: SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

5.隔离级别的作用范围

事务隔离级别的作用范围分为两种:

全局级:对所有的会话有效

会话级:只对当前的会话有效

例如,设置会话级隔离级别为READ COMMITTED :

MySQL> SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

或:

MySQL> SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

设置全局级隔离级别为READ COMMITTED :

MySQL> SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;

6.查看隔离级别

服务器变量tx_isolation(包括会话级和全局级两个变量)中保存着当前的会话隔离级别。

为了查看当前隔离级别,可访问tx_isolation变量:

查看会话级的当前隔离级别:

MySQL> select @@tx_isolation;

或:

MySQL> select @@session.tx_isolation;

查看全局级的当前隔离级别:

MySQL> select @@global.tx_isolation;

7.并发事务与隔离级别示例

read uncommitted(未提交读) --脏读(Drity Read) ,如下表8-2所示:

表8-2

会话一

会话二

MySQL> prompt s1>

MySQL> use bjpowernode

s1>use bjpowernode

MySQL> prompt s2>

s1>create table tx (

id int(11),

num int (10)

);

s1>set global transaction isolation level read uncommitted;

s1>start transaction;

s2>start transaction;

s1>insert into tx values (1,10);

s2>select * from tx;

s1>rollback;

s2>select * from tx;

read committed(已提交读) ,如下表8-3所示:

表8-3

会话一

会话二

s1> set global transaction isolation level read committed;

s1>start transaction;

s2>start transaction;

s1>insert into tx values (1,10);

s1>select * from tx;

s2>select * from tx;

s1>commit;

s2>select * from tx;

repeatable read(可重复读) ,如下表8-4所示:

表8-4

会话一

会话二

s1> set global transaction isolation level repeatable read;

s1>start transaction;

s2>start transaction;

s1>select * from tx;

s1>insert into tx values (1,10);

s2>select * from tx;

s1>commit;

s2>select * from tx;

8.8 本章小结

本章主要阐述了MySQL中的存储引擎和事务。

标签:事务,tx,08,存储,引擎,提交,MySQL
From: https://www.cnblogs.com/zxbin/p/17592157.html

相关文章

  • MIT 6.S081 Lec14: File system
    Overview文件系统的设计目标就是组织和存储数据,文件系统一个比较重要功能是持久化,即重启之后,数据不会丢失。xv6通过把数据存储在virtiodisk上来实现持久化。文件系统设计的几大挑战:Thefilesystemneedson-diskdatastructurestorepresentthetreeofnameddirecto......
  • Mit6.s081 Lec15: xv6 的 logging system
    Logginglayerfilesystem设计的一大重要问题就是crashrecovery。这是因为文件系统操作往往涉及向磁盘多次写入,而几次写入之后的crash可能导致磁盘上的文件系统处于一个不一致的状态。Forexample,supposeacrashoccursduringfiletruncation(settingthelengthof......
  • Windows漏洞CVE-2019-0708
    Windows漏洞CVE-2019-0708标签(空格分隔):网络攻防技术1.python-exp攻击步骤(1)开启Windows7的远程桌面服务:在windows7系统中依次选择【控制面板】→【系统和安全】→【允许远程访问】打开远程访问服务。(2)下载漏洞利用脚本:在互联网上搜索CVE-2019-0708相关的漏洞利用脚本,可......
  • 2024备考408Week20
    一、本周总结:使用时间:(目标40h:15h数学+15h专业课+5h英语+5h政治,除了周六10h外其余每天学习5h)总计23h22min,数学10h45min,专业课8h37min,英语3h,政治1h。二、存在问题:1.数学、专业课(DS+OS+CO+CN)做题训练不够,思考不够深入,计算不够熟练和准确,后期一定要开始加强了;2.碎片化时间和整块时间......
  • Unity可确定性定点数(软浮点)物理引擎
    Unity自带的物理引擎,都是用的硬件浮点,硬件浮点有个特点,就是不同CPU,实现的标准可能不一样,导致会有误差。也就是说,Unity自带的物理引擎,在不同平台上,模拟的效果可能会不一样。而且就算是同一机器,也可能因为浮点造成的误差,导致每次模拟的结果都不一样。解决方法就是用软件浮点(定点数......
  • 408-数据结构算法题笔记
    常用基本操作1.定义整数无穷大#defineINT_MAX=0x7f7f7f7f;2.绝对值函数intabs_(intx){ if(x<0)return-x; returnx;}3.最大最小值函数(一般可以直接写吧)intmin(inta,intb){ if(a<b)returna; returnb;}说明时空间复杂度可以先设neg:代码规范1.函......
  • error C1083: 无法打开包括文件:“iostream.h”: No such file or directory
    用VS2010打开VC++6程序,按下F5键会发现有错误提示:errorC1083:无法打开包括文件:“iostream.h”:Nosuchfileordirectory;而程序在VC++6中没有任何问题!主要的原因是:1.#include<iostream.h>是原来的C语言里面的,而#include<iostream>是c++的标准库里的,而要调用这个这个标准库......
  • 08. 点亮LED
    一、LED简介  发光二极管,简称为LED,是一种常用的发光器件,它由含镓(Ga)、砷(As)、磷(P)、氮(N)等的化合物制成。通过电子与空穴复合释放能量发光,它在照明领域应用广泛。  发光二极管与普通二极管一样是由一个PN结组成,也具有单向导电性。当给发光二极管加上正向电压后,从P......
  • ABC308
    T1:NewScheme模拟代码实现defsolve():s=list(map(int,input().split()))foriinrange(8):ifs[i]%25!=0:returnFalseifs[i]<100ors[i]>675:returnFalseforiinrange(7):ifs[i]......
  • 传奇引擎区分hero引擎有什么用呢?
    hero引擎是我们很常用的引擎,那么hero引擎有什么用呢? 虽然我们经常使用这款引擎,但其实这个引擎还有很多我们不知道的,今天借助这篇文章,来认真的说说有关herom2引擎方方面面的知识,多多知道的也不多,但知道的,一定尽量全部无私奉献在中国传奇上吧。herom2引擎官方但网上目前有三家网站自......