mysql支持事务的存储引擎_MySQL基础(三)【MySQL事务与存储引擎】

3.1-数据库事务

什么是事务

一系列有序的数据库操作:

要么全部成功

要么全部回退到操作前的状态

中间状态对其他连接不可见

事务的基本操作:

基本操作 说明

start transaction 开始事务

commit 提交(全部完成)

rollback 回滚(回到初始状态)

-- 开启一个事务

start transaction;

-- 或者使用(非标准sql)

begin;

insert into t values (1, 1, 1);

-- 事务结束,插入成功

commit;

begin;

insert into t values (2, 1, 1);

insert into t values (3, 1, 1);

insert into t values (4, 1, 1);

-- 事务结束,没有插入数据

rollback;

begin;

insert into t values (1, 1, 1);

savepoint a1;

insert into t values (2, 1, 1);

-- 回滚到指定的保存点

rollback to a1;

commit;

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

自动提交

autocommit可以在session级别设置

每个DML操作都自动提交

DDL永远都是自动提交,无法通过rollback回滚

事务的四个基本属性(ACID)

原子性(Atomicity)

一致性(Consistency)

隔离性(Isolation)

持久性(Durability)

事务的原子性

包含在事务中的操作要么全部被执行,要么都不执行

中途数据库或应用发生异常,未提交的事务都应该被回滚

事务的一致性

数据的正确性,合理性,完整性

数据一致性应该符合应用需要规则:

余额不能是负数

交易对象必须先有账号

用户账号不能重复

事务的结果需要满足数据的一致性约束

事物的持久性

提交完成的事务对数据库的影响必须是永久性的

数据库异常不会丢失事务更新

通常认为成功写入磁盘的数据即为持久化成功

事务的持久化的实现

数据文件持久化

随机同步刷新(慢)

事务日志持久化与实例恢复

顺序同步刷新(快) -> 事务日志

随机异步刷新 -> 磁盘

事务日志 -> 磁盘(实例恢复)

事务的隔离性

数据库事务在提交完成前,中间的任何数据变化对其他的事务都是不可见的。

数据库隔离现象

隔离现象 描述

脏读(Dirty Read) 事务B读到事务A尚未提交的数据变更

不可重复读(NonRepeatable Read) 事务B读取前后两次读取一条记录之间该记录被事务A修改并提交,于是事务B读到了不一样的结果

幻读(Phantom Read) 事务B按条件匹配到了若干行记录并修改。但是由于修改过程中事务A新插入了符合条件记录,导致B更新完成后发现仍有符合条件却未被更新的记录。

数据库隔离等级

隔离等级 脏读 不可重复读 幻读

未提交读 可能 可能 可能

已提交读 不可能 可能 可能

可重复读 不可能 不可能 可能

可串行化读 不可能 不可能 不可能

MySQL的事务隔离级别

InnoDB默认标记为可重复读

InnoDB并不是标准定义上的课重复读

InnoDB默认在可重复读的基础上避免幻读

MySQL事务隔离级别设置

可在global/session/下个事务,级别分别进行设置

建议使用Read committed(同Oracle)

或者建议使用默认的Repeatable read

set tx_isolation = ''

-- 设置隔离级别

1

2

事务与并发写

某个正在更新的记录再提交或回滚前不能被其他事务同时更新

事务回滚的实现

回滚段(rollback segment)与数据前像

3.2-存储引擎概述

MySQL程序层次架构

MySQL架构

MySQL存储引擎

有多种可选方案,可插拔,可修改存储引擎

基于表选择使用何种存储引擎

主要存储引擎

存储引擎 常用度 支持事务

InnoDB 主要,推荐 是

MyISAM 古老,偶尔有用,系统表 否

MEMORY 偶尔临时表有用,纯内存 否

BLACKHOLE 不用来存放数据,个别特殊用处 否

TokuDB 新颖,个别特殊场景有奇效 是

Cluster 新颖,分布式,内存,线上不要用 是

InnoDB存储引擎

索引组织表

支持事务

支持行级锁

数据块缓存

日志持久化

稳定可靠,性能好,线上尽量使用InnoDB

MyISAM存储引擎

堆表

不支持事务

只维护索引缓存池,表数据缓存交给操作系统

锁粒度较大

数据文件可以直接拷贝,偶尔可能会用上

不建议线上业务数据使用

MWMORY存储引擎

数据全内存存放,无法持久化

性能较高

不支持事务

适合偶尔作为临时表使用

create temporary table tmp (id int) engine = memory ;

BLACKHOLE存储引擎

数据不作任何存储

利用MySQL Replicate,充当日志服务器

在MySQL Replicate环境中充当代理主

TokuDB

分形树存储结构

支持事务

行锁

压缩效率较高

适合大批量insert的场景

MySQL Cluster

多主分布式集群

数据节点间冗余,高可用

支持事务

设计上易于扩展

面向未来,线上慎用

改变表的存储引擎

alter table m ENGINE=innodb;

3.3-InnoDB存储引擎

InnoDB存储引擎体系架构

InnoDB

InnoDB相关的磁盘文件

文件 名称 数量 位置

系统表空间 ibdata1 一个实例一个 innodb_data_home_dir

日志文件 ib_logfile0/1 一个实例两个(可配置) innodb_log_group_home_dir

表定义文件 表名.frm 每张表一个 Schema目录下

表数据文件 表名.ibd 如果innodb_file_per_table = 1, 则每张表一个 Schema目录下

InnoDB系统表空间文件

ibdata1里存放了什么:

回滚段

所有InnoDB表元数据信息

Double Write, Insert buffer dump等等….

自动扩展机制

InnoDB与磁盘文件有关的参数

参数 样例值 备注

innodb_data_home_dir /data/mysql/node_1 数据主目录

innodb_log_group_home_dir /data/mysql/node_1 一般同上

innodb_data_file_path ibdata1:512M:autoextned 请开启autoextned

innodb_autoextend_increment 128 MB,勿太大或太小

innodb_file_per_table 1 强烈建议开启

innodb_log_file_size 100MB 性能相关

innodb_log_files_in_group 2 性能相关

InnoDB数据文件存储结构

索引组织表(聚簇表)

根据表逻辑主键排序

数据节点每页16K

根据主键寻址速度很快

主键值递增的insert插入效率较好

主键值随机insert插入效率差

因此,InnoDB表必须指定主键,建议使用自增数字

InnoDB数据块缓存池

数据的读写需要经过缓存

数据以整页(16K)为单位读取到缓存中

缓存中的数据以LRU策略换出

IO效率高,性能好

InnoDB Buffer Pool相关参数

参数 样例值 备注

innodb_buffer_pool_size 10G 根据总物理内存设置

InnoDB数据持久化与事务日志

事务日志实时持久化

内存变化数据(脏数据)增量异步刷出到磁盘

实例故障靠重放日志恢复

性能好,可靠,恢复快

InnoDB日志持久化相关参数

参数 样例值 备注

innodb_flush_log_at_trx_commit 1 可选:0:每隔1s写入并持久化一次日志。1:每次commit都写入并持久化日志。2:每次提交日志写到内存,每1s持久化一次

InnoDB行级锁

写不阻塞读

不同行间的写互相不阻塞

并发性能好

InnoDB与事务ACID

事务ACID特性完整支持

回滚段失败回滚

支持主外键约束

事务版本+回滚段=MVCC

事务日志持久化

默认可重复读隔离级别,可以调整

3.4-InnoDB事务锁

什么是计算机程序锁

计算机程序锁

控制对共享资源进行并发访问

保护数据的完整性和一致性

数据库中的锁

分为两个大类

lock latch/mutex

对象 事务

保护 数据库逻辑内容

持续时间 事务过程中

我们主要关心的是事务锁

数据库事务并发

对同一行记录的修改必须串行化

事务锁粒度

行锁

InnoDB, Oracle

页锁

SQL Server

表锁

MyISAM, Memory

锁升级

InnoDB存储引擎中的锁模式与粒度

四种基本锁模式

共享锁(S) - 读锁 - 行锁

排他锁(X) - 写锁 - 行锁

意向共享锁(IS) - 表级

意向排他锁(IX) - 表级

意向锁

意向锁总是自动先加,并且意向锁自动加自动释放

意向锁提示数据库这个session将要在接下来施加何种锁

意向锁和X/S锁级别不同,除了阻塞全表级别的X/S锁外其他任何锁

InnoDB锁模式互斥

锁互斥

数据库加锁操作

一般的select语句不加任何锁,也不会被任何事物锁阻塞

读的隔离性由MVCC确保

S锁

手动:select from tb_test lock in share mode;

自动:insert前

X锁

手动:select from tb_test lock for update;

自动:update,delete前

InnoDB行锁的实现

通过索引项加锁实现

只有条件走索引才能实现行级锁

索引上有重复值,可能锁住多个记录

查询有多个索引可以走,可以对不同索引加锁

是否对索引加锁实际上取决于MySQL执行计划

自增主键做条件更新,性能最好

没有索引的话会对整张表加锁。

InnoDB的gap lock

什么是幻读

gap lock消灭幻读

InnoDB消灭幻读仅仅为了确保statement模式replicate的主从一致性

小心gap lock

自增主键做条件更新,性能最好

死锁

什么是死锁

A、B两个事务,A先更新t1,同时B更新t2,A再更新t2,B再更新t1就发生了死锁。

死锁数据库自动解决

数据库挑选冲突事务中回滚代价较小的事务回滚

死锁预防

单表死锁可以根据批量更新里的更新条件排序

可能冲突的跨表事务尽量避免并发

尽量缩短事务长度

业务逻辑加锁

业务流程中的悲观锁

任何的并发修改都有可能造成我们的业务逻辑最终的错误,在事务流程中一开始就加锁,最后释放

如何缩短锁的时间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/566503.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css背景从左到右颜色渐变,CSS:linear-gradient()背景颜色渐变

background: linear-gradient(direction,color-stop1,color-stop2,...);direction:用角度值指定渐变的方向(或角度);color-stop1,color-stop2,...:用于指定渐变的起止颜色ps:至少需要两种颜色1 background: -webkit-linear-gradie…

WordPress文章ajax,使用ajax在WordPress后台删除文章方法

今天wpmee小编分享使用ajax在WordPress后台删除文章方法,直接上代码,将下面的代码添加到当前启用的WordPress主题的functions.php里面。// 后台 文章列表 ajax删除文章add_action( admin_footer, dahuzi_custom_internal_javascript );function dahuzi_c…

mac os qt项目编译_【Qt开发】第一个Qt程序Hello World!

一:说在前头我的第一份工作是做生产工具,当时用的MFC,IDE是VC6.0,现在想想真是古董级别,10年至今,微软也一直没有对MFC进行升级,冥冥中感觉微软自己都放弃MFC了,市场上貌似MFC的岗位…

vbs读取服务器上的txt文件,VBS读写txt文件常用方法

1、打开文件使用opentextfile方法set fs createobject(“scripting.filesystemobject”)set tsfs.opentextfile(“c:\1.txt”,1,true)注意这里需要填入文件的完整路径,后面一个参数为访问模式1为forreading2为forwriting8为appending第三个参数指定如果指定文件不存…

mysql的四层架构_分布式数据库服务器的四层架构

分布式数据库服务器的四层架构:访问层:接收访问信息并按负荷智能的分配给中转服务器,接受数据结果并返回客户端。中转层:接收访问服务器发来的数据访问指令,从总储存服务器寻找数据分布所在的储存服务器,发…

centos mysql 5.5.57_Centos MySQL 5.7安装、升级教程

MySQL 5.7安装、升级笔记分享:卸载当前的 MySQL查看当前 MySQL 版本:停止 MySQL 服务备份数据【数据不重要可以忽略】备份数据库,升级MySQL通常不会丢失数据,但保险起见,我们需要做这一步。输入命令:[rootc…

ug许可服务器在那个文件里,ug许可证位置在哪_ug许可证文件在哪的图文步骤

最近有朋友问小编ug许可证位置在哪的问题,ug安装后许可证在哪里呢?我们应该如何找到ug许可证文件夹的位置呢?相信很多朋友还不太明白。别着急,今天小编就针对ug许可证位置在哪的问题,以ug nx8.5为例,为大家…

如何登陆网页的back office_如何使用iPhone面容ID快速登陆应用或网页

我们总是会在手机中下载很多App,但是不一定都能够记住这些App的密码,即使就算记住了,想要使用某些应用时,不断需要输入密码也让人觉得焦虑。好在苹果在iOS 12中改进了密码自动填充功能,搭配您设备上先进的面容 ID 功能…

mysql 复杂的sql_mysql 一个复杂的sql

查询 物资明细:SELECT r.material_id,r.material_category,r.material_name,r.material_quality,r.standard,r.product_factory,r.material_type,r.measure_unit,(r.numr.num_sub) as num,(r.numr.num_sub)-num_sd-num_yd as current_js_numFROM-- 单独计算各个数值…

接口可以继承抽象类吗_Python接口类的多继承以及抽象类的单继承

一、接口类(面向对象开发的思想和规范)的多继承需求:定义一个tiger类:会走,会游定义一个hawk类:会走,会飞定义一个swan类:会走,会游,会飞(a)如果像以下代码的方式,则不能…

mysql查询注意_mysql中sql查询使用注意

1.注意DESC关键字仅适用于在它前面的列名(birth);不影响species列的排序顺序。SELECT name, species, birth FROM petORDER BY species, birth DESC; ---desc只影响birth.先按照species升序列排序,species值相同的再按照birth降序排序2.日期计算MySQL提供了几个函数…

php查询MySQL结果转化为数组_PHP如何将SQL查询结果转为多维数组,并按查询行输出...

在php中,SQL查询数据库得到的是多行多列的数据,如何将查询结果转为二维数组,我的目的是把多行查询结果按行输出,有没有什么方法,求详细代码示例查询结果示例:reserv_idnametyper...在php中,SQL查…

python tclerror_TclError:错误的窗口路径名(Python)

在其中一个视图中,有一个用于关闭实际视图的按钮,它可以工作,但当我再次尝试打开该视图时,它会显示下一个错误:Exception in Tkinter callbackTraceback (most recent call last):File "/usr/lib/python2.7/lib-t…

python线程安全的计数器_Python多线程同步Lock、RLock、Semaphore、Event实例

一、多线程同步由于CPython的python解释器在单线程模式下执行,所以导致python的多线程在很多的时候并不能很好地发挥多核cpu的资源。大部分情况都推荐使用多进程。python的多线程的同步与其他语言基本相同,主要包含:Lock & RLock &#x…

易语言mysql乱码_分享一个解决MySQL写入中文乱码的方法

【编程语言:易语言】之前有发帖请教过如何解决MySQL写入中文乱码的问题。但没人会,或者是会的人不想回答。搜索网上的答案并尝试很多次无效,所以当时就因为这个乱码问题搁浅了一个软件很多日子。直到昨天又一次互联网搜索,尝试很多…

java地址传递_关于java中是地址传递还是值传递的测试

首先,我的结论是,如果是对对象进行 操作的话,传的是地址,如果是对基本数据类型进行操作的话,传的是值!下面,我再用一个小的实例来测试我的结论:class Person {int age;public void setAge(int a…

mongodb java数组_MongoDB 基础java数据类型

mongodb的java数据类型有Object Ids 自动IDRegular Expressions 正则表达式搜索记录Dates/Times 时间Database References 数据基础结构Binary Data 二进制流Timestamp Data 时间标记戳Code Data 代码数据Embedded Documents 嵌入式文档Arrays 数组类型详细参考原来英文 http:/…

java 线程安全问题_java线程安全问题原因及解决办法

1.为什么会出现线程安全问题计算机系统资源分配的单位为进程,同一个进程中允许多个线程并发执行,并且多个线程会共享进程范围内的资源:例如内存地址。当多个线程并发访问同一个内存地址并且内存地址保存的值是可变的时候可能会发生线程安全问…

java foward_java 中sendredirect()和forward()方法的区别

HttpServletResponse.sendRedirect与RequestDispatcher.forward方法都可以实现获取相应URL资源。sendRedirect实现请求重定向,forward实现的是请求转发。在web服务器内部的处理机制也是不一样的。1. 跳转方式运用forward方法只能重定向到同一个Web应用程序中的一个资…

java万能编码转换_java编码转换的详细过程

常见的JAVA程序包括以下类别:*直接在console上运行的类(包括可视化界面的类)*JSP代码类(注:JSP是Servlets类的变型)*Servelets类*EJB类*其它不可以直接运行的支持类这些类文件中,都有可能含有中文字符串,并且常用前三类JAVA程序和…