事务管理

10分钟梳理MySQL核心知识点

被刻印的时光 ゝ 提交于 2020-03-31 04:09:29
今天我们用10分钟,重点梳理一遍以下几方面: 数据库知识点汇总; 数据库事务特性和隔离级别; 详解关系型数据库、索引与锁机制; 数据库调优与最佳实践; 面试考察点及加分项。 一、数据库的不同类型 1.常用的关系型数据库 Oracle:功能强大,主要缺点就是贵 MySQL:互联网行业中最流行的数据库,这不仅仅是因为MySQL的免费。可以说关系数据库场景中你需要的功能,MySQL都能很好的满足,后面详解部分会详细介绍MySQL的一些知识点 MariaDB:是MySQL的分支,由开源社区维护,MariaDB虽然被看作MySQL的替代品,但它在扩展功能、存储引擎上都有非常好的改进 PostgreSQL:也叫PGSQL,PGSQL类似于Oracle的多进程框架,可以支持高并发的应用场景,PG几乎支持所有的SQL标准,支持类型相当丰富。PG更加适合严格的企业应用场景,而MySQL更适合业务逻辑相对简单、数据可靠性要求较低的互联网场景。 2.NoSQL数据库(非关系型数据库) Redis:提供了持久化能力,支持多种数据类型。Redis适用于数据变化快且数据大小可预测的场景。 MongoDB:一个基于分布式文件存储的数据库,将数据存储为一个文档,数据结构由键值对组成。MongoDB比较适合表结构不明确,且数据结构可能不断变化的场景,不适合有事务和复杂查询的场景。 HBase:建立在HDFS

coding++:事务管理 隔离级别

泄露秘密 提交于 2020-03-29 15:01:03
在声明事务时,只需要通过value属性指定配置的事务管理器名即可,例如: @Transactional(value="transactionManagerPrimary") 。 除了指定不同的事务管理器之后,还能对事务进行隔离级别和传播行为的控制,下面分别详细解释: 隔离级别: 隔离级别是指若干个并发的事务之间的隔离程度,与我们开发时候主要相关的场景包括:脏读取、重复读、幻读。 我们可以看 org.springframework.transaction.annotation.Isolation 枚举类中定义了五个表示隔离级别的值: DEFAULT :这是默认值,表示使用底层数据库的默认隔离级别。对大部分数据库而言,通常这值就是: READ_COMMITTED 。 READ_UNCOMMITTED :该隔离级别表示一个事务可以读取另一个事务修改但还没有提交的数据。 该级别不能防止脏读和不可重复读,因此很少使用该隔离级别。 READ_COMMITTED :该隔离级别表示一个事务只能读取另一个事务已经提交的数据。该级别可以防止脏读,这也是大多数情况下的推荐值。 REPEATABLE_READ :该隔离级别表示一个事务在整个过程中可以多次重复执行某个查询,并且每次返回的记录都相同。 即使在多次查询之间有新增的数据满足该查询,这些新增的记录也会被忽略。 该级别可以防止脏读和不可重复读。

分布式事务

夙愿已清 提交于 2020-03-29 00:23:03
分布式事务 1.什么是事务   事务是用于访问和修改各种数据项的一个程序单位,这个程序要么全部执行,要么全部放弃。 2.为什么会引入事务的概念   针对于数据库来说,对数据文件的记录进行访问或修改,对这些数据项的修改封装起来来保证对数据项的访问或修改的原子性、一致性、隔离性、持久性。 3.事务的属性   (1)原子性:所有的工作要么在数据库中保存下来,要么全部回滚,全部不保留;   (2)一致性:事务完成或者撤销之后应该处于一致的状态;   (3)隔离性:多个事务同时进行互相互不干扰;   (4)持久性:事务提交后,所做的工作就被永久的保存下来。 4.事务的实现   (1)私有工作空间与影子更新   当进程启动事务T时,分配一个私有工作空间W,在提交或终止T前所有的读写操作都是在W中进行。      在(a)中,在对某文件进行访问时,共有三个数据块,在磁盘中对应于盘块0,、盘块1、盘块2,(b)当进程启动该事务时,便分配给它一个私有工作空间,如果我们现在要对盘块0和盘块3进行修改操作,那么就会在相应的0'和3’中进行,所有对文件的访问都是在私有工作空间进行的,在事务提交之前,对文件没有产生影响,访问的索引节点还是起初的索引节点,(c)在事务提交之后,那么影子块就会变成真正的盘块,私有工作空间的索引节点替代起初的索引节点。   (2)先写日志(WAL)   日志能够记录事务标识

NodeJs mysql 开启事务

房东的猫 提交于 2020-03-28 12:55:10
如题;node后台使用mysql数据库,并使用事务来管理数据库操作。 这里主要讲一个事务的封装并写了一个INSERT 插入操作。 code: 基础code: db.config.js const mysql = require('mysql') const pool = mysql.createPool({ connectionLimit: 20, //连接池连接数 host: 'localhost', //数据库地址,这里用的是本地 database: 'xxxx', //数据库名称 user: 'xxxxx', // username password: '*****' // password }) //返回一个Promise链接 const connectHandle = () => new Promise((resolve, reject) => { pool.getConnection((err, connection) => { if(err) { console.error('链接错误:' + err.stack + '\n' + '链接ID:' + connection.threadId) reject(err) } else { resolve(connection) } }) }) module.exports = connectHandle 事务操作

MySQL存储引擎介绍

狂风中的少年 提交于 2020-03-28 07:43:50
一 存储引擎解释   首先确定一点,存储引擎的概念是MySQL里面才有的,不是所有的关系型数据库都有存储引擎这个概念,后面我们还会说,但是现在要确定这一点。     在讲清楚什么是存储引擎之前,我们先来个比喻,我们都知道录制一个视频文件,可以转换成不同的格式,例如mp4,avi,wmv等,而存在我们电脑的磁盘上也会存在于不同类型的文件系统中如windows里常见的ntfs、fat32,存在于linux里常见的ext3,ext4,xfs,但是,给我们或者用户看懂实际视频内容都是一样的。直观区别是,占用系统的空间大小与清晰程度可能不一样。 那么数据库表里的数据存储在数据库里及磁盘上和上述的视频格式及存储磁盘文件的系统格式特征类似,也有很多种存储方式。   但是对于用户和应用程序来说同样一张表的数据,无论用什么引擎来存储,用户能够看到的数据是一样的。不同储引擎存取,引擎功能,占用空间大小,读取性能等可能有区别。说白了,存储引擎就是在如何存储数据、提取数据、更新数据等技术方法的实现上,底层的实现方式不同,那么就会呈现出不同存储引擎有着一些自己独有的特点和功能,对应着不同的存取机制。   因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即:对表的存储、操作等的实现方法不同),表是什么,表本质上就是磁盘上的文件。   其实MySQL支持多种存储引擎

SQL学习笔记

爷,独闯天下 提交于 2020-03-28 04:21:01
SQL Server管理 (1) SQL Server的两种验证方式:用户名验证和Windows验证,开发时用Windows验证就行了。 (2) 常用字段类型:bit(可选值0,1),datetime,int,varchar,nvarchar(可能含有中文用nvarchar)。 (3) varchar(),nvarchar().char(n)的区别: char(n)不足长度n的部分用空格填充 。Var: variable:可变的。 SQL语句入门 (1) SQL语句是和DBMS”交谈”专用的语句,不同DBMS都认SQL语法。 (2) SQL语句中字符串用 单引号 。 (3) SQL语句是 大小写不敏感的 ,不敏感指的是SQL关键字,字符串值还是大小写敏感。 (4) 创建表,删除表不仅可以手工完成,还可以执行SQL语句来完成,在自动化部署,数据导入中用的很多。 创建表: create table T_Person ( ID int not null, Name nvarchar(50), Age int null ) 删除表: drop table T_Person (5) 执行简单的Insert语句: insert into T_Person(ID,Name,Age) values (1,’Jim’,39) (6) *(熟悉):SQL主要分DDL(数据定义语言)和DML

Spring 框架系列之事务管理

筅森魡賤 提交于 2020-03-27 22:21:08
1、事务回顾 (1)、什么是事务: 事务是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败。 (2)、事务特性(ACID) 原子性 :强调事务的不可分割 一致性 :事务的执行的前后数据的完整性保持一致 隔离性 :一个事务执行的过程中,不应该受到其他事务的干扰 持久性 :事务一旦结束,数据就持久到数据库 (3)、事务并发安全性问题 脏读 :一个事务读到了另一个事务的未提交的数据 不可重复读 :一个事务读到了另一个事务已经提交的 update 的数据导致多次查询结果不一致 幻读 :一个事务读到了另一个事务已经提交的 insert 的数据导致多次查询结果不一致 (4)、事务隔离级别 未提交读 :脏读,不可重复读,幻读都有可能发生 已提交读 :避免脏读,但是不可重复读和幻读有可能发生 可重复读 :避免脏读和不可重复读,但是幻读有可能发生 串行化 :避免以上所有读问题 (5)、常见数据库默认事务隔离级别 MySQL:可重复读 Oracle:读已提交 2、Spring 事务管理 (1)、基本事务操作 打开事务 提交事务 回滚事务 (2)、事务操作对象 Spring 事务管理中提供了 PlatformTransactionManager 接口操作事务,其中最为核心的对象是 TransactionManager 对象。 (3)、Spring 事务隔离级别 读未提交 读已提交

SQL Server AlwaysOn搭建

此生再无相见时 提交于 2020-03-27 12:07:57
SQL Server Alwayson概念总结 原地址: https://www.cnblogs.com/chenmh/p/6972007.html 一、alwayson概念 “可用性组” 针对一组离散的用户数据库(称为“可用性数据库” ,它们共同实现故障转移)支持故障转移环境。 一个可用性组支持一组主数据库以及一至八组对应的辅助数据库(包括一个主副本和两个同步提交辅助副本)。 辅助数据库不是备份,应继续定期备份您的数据库及其事务日志。 每组可用性数据库都由一个“可用性副本” 承载。 有两种类型的可用性副本:一个“主副本” 和一到四个“辅助副本”。 它承载主数据库和一至八个“辅助副本” ,其中每个副本承载一组辅助数据库,并用作可用性组的潜在故障转移目标。 可用性组在 可用性副本级别 进行故障转移。 可用性副本仅在数据库级别提供冗余 - 针对一个可用性组中的该组数据库。 故障转移不是由诸如因数据文件丢失或事务日志损坏而使数据库成为可疑数据库等数据库问题导致的。 主副本使主数据库可用于客户端的读写连接。 此外,它在称为“数据同步” 的过程中使用,在数据库级别进行同步。 主副本将每个主数据库的事务日志记录发送到每个辅助数据库。 每个次要副本缓存事务日志记录(“硬化”日志),然后将它们应用到相应的辅助数据库。 主数据库与每个连接的辅助数据库独立进行数据同步。 因此

保证分布式系统数据一致性的6种方案

冷暖自知 提交于 2020-03-27 04:03:22
https://www.cnblogs.com/soundcode/p/5590710.html 编者按:本文由「高可用架构后花园」群讨论整理而成。 有人的地方,就有江湖 有江湖的地方,就有纷争 问题的起源 在电商等业务中,系统一般由多个独立的服务组成,如何解决分布式调用时候数据的一致性? 具体业务场景如下,比如一个业务操作,如果同时调用服务 A、B、C,需要满足要么同时成功;要么同时失败。A、B、C 可能是多个不同部门开发、部署在不同服务器上的远程服务。 在分布式系统来说,如果不想牺牲一致性,CAP 理论告诉我们只能放弃可用性,这显然不能接受。为了便于讨论问题,先简单介绍下数据一致性的基础理论。 强一致 当更新操作完成之后,任何多个后续进程或者线程的访问都会返回最新的更新过的值。这种是对用户最友好的,就是用户上一次写什么,下一次就保证能读到什么。根据 CAP 理论,这种实现需要牺牲可用性。 弱一致性 系统并不保证续进程或者线程的访问都会返回最新的更新过的值。系统在数据写入成功之后,不承诺立即可以读到最新写入的值,也不会具体的承诺多久之后可以读到。 最终一致性 弱一致性的特定形式。系统保证在没有后续更新的前提下,系统 最终 返回上一次更新操作的值。在没有故障发生的前提下,不一致窗口的时间主要受通信延迟,系统负载和复制副本的个数影响。DNS 是一个典型的最终一致性系统。 在工程实践上

EntityFramework笔记

北战南征 提交于 2020-03-24 08:02:08
参照文档: http://www.cnblogs.com/farb/p/ABPAdvancedTheoryContent.html 案例: http://pan.baidu.com/s/1c1Qgg28 一、领域建模和管理实体关系 二、 使用LINQ to Entities操作实体 三、预加载 四、CURD 五、EF使用视图 六、EF使用存储过程 七、异步API 八、管理并发 九、事务 十、数据库迁移 十一、应用迁移 十二、EF的其他功能 一、领域建模和管理实体关系 1,流利地配置领域类到数据库模式的映射 namespace FirstCodeFirstApp { public class Context:DbContext { public Context() : base("name=FirstCodeFirstApp") { } public DbSet<Donator> Donators { get; set; } public DbSet<PayWay> PayWays { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Donator>().ToTable("Donators").HasKey(m => m