mysql事务

分布式

夙愿已清 提交于 2019-12-05 02:10:23
谈谈业务中使用分布式的场景 首先,需要了解系统为什么使用分布式。 随着互联网的发展,传统单工程项目的很多性能瓶颈越发凸显,性能瓶颈可以有几个方面: 1.应用服务层:随着用户量的增加,并发量增加,单项目难以承受如此大的并发请求导致的性能瓶颈。 2.底层数据库层:随着业务的发展,数据库压力越来越大,导致的性能瓶颈。 #场景1:应用系统集群的 Session 共享 应用系统集群最简单的就是服务器集群,比如:Tomcat 集群。应用系统集群的时候,比较凸显的问题是 Session 共享,Session 共享我们一是可以通过服务器插件来解决。另外一种也可以通过 Redis 等中间件实现。 #场景2:应用系统的服务化拆分 服务化拆分,是目前非常火热的一种方式。现在都在提微服务。通过对传统项目进行服务化拆分,达到服务独立解耦,单服务又可以横向扩容。服务化拆分遇到的经典问题就是分布式事务问题。目前,比较常用的分布式事务解决方案有几种:消息最终一致性、TCC 补偿型事务等。 #场景3:底层数据库的压力分摊 如果系统的性能压力出现在数据库,那我们就可以读写分离、分库分表等方案进行解决。 Session 分布式方案 #基于 nfs(net filesystem) 的 Session 共享 将共享服务器目录 mount 各服务器的本地 session 目录,session 读写受共享服务器 io 限制

MySQL InnoDB 实现高并发原理

和自甴很熟 提交于 2019-12-05 01:49:18
MySQL 原理篇 MySQL 索引机制 MySQL 体系结构及存储引擎 MySQL 语句执行过程详解 MySQL 执行计划详解 MySQL InnoDB 缓冲池 MySQL InnoDB 事务 MySQL InnoDB 锁 MySQL InnoDB MVCC MySQL InnoDB 实现高并发原理 MySQL InnoDB 快照读在RR和RC下有何差异 转载: 《InnoDB并发如此高,原因竟然在这?》 并发控制 为啥要进行并发控制? 并发的任务对同一个临界资源进行操作,如果不采取措施,可能导致不一致,故必须进行并发控制(Concurrency Control)。 技术上,通常如何进行并发控制? 通过并发控制保证数据一致性的常见手段有: 锁(Locking) 数据多版本(Multi Versioning) 锁 如何使用普通锁保证一致性? 操作数据前,锁住,实施互斥,不允许其他的并发任务操作; 操作完成后,释放锁,让其他任务执行; 如此这般,来保证一致性。 普通锁存在什么问题? 简单的锁住太过粗暴,连“读任务”也无法并行,任务执行过程本质上是串行的。 于是出现了共享锁与排他锁: 共享锁(Share Locks,记为S锁),读取数据时加S锁 排他锁(eXclusive Locks,记为X锁),修改数据时加X锁 共享锁与排他锁的玩法是: 共享锁之间不互斥,简记为:读读可以并行

mysql-函数/事务

自古美人都是妖i 提交于 2019-12-04 23:43:45
函数和存储过程 ###函数 delimiter $ create function 函数名(形参1 类型1,形参2 类型2...) returns 返回类型   #-- 注意是retruns begin set @val=函数体;    #-- 函数语句集,set @val 定义变量 return val; end $ delimiter ; select 函数名(参数); # 调用 ###过程 delimiter $$ create procedure st(过程类型 参数1 参数类型1,...) begin select name,age from class_1; select name,score from class_1 order by score desc; end $$ delimiter ; call st(); 过程类型:in 可接收参数据 out可外传数据 inout 可接可外传 ###删除 DROP PROCEDURE /FUNCTION [IF EXISTS] sp_name; ##事务 begin; 开启 commit;提交 rollback;回退 特点: 1.原子性 一个事务是完整整体,要么全部执行,要么全部不执行 2.一致性 数据库总是从一个一致性的状态转换到另一个一致性的状态 3.隔离性 一个事务没有提交前,其他事务不可见 4.永久性 提交之后

数据库死锁导致分布事务中大批量更新数据库不成功

随声附和 提交于 2019-12-04 23:29:45
#1 问题描述# 未签收的订单十五天之后自动签收:总共2个步骤: step1 在乐购系统中批量更新未签收订单的状态,step2: 通过RPC修改订单系统的订单状态, step1和step2放到一个事务中。然后发现step2 订单DB状态修改成功,但是step1 乐购db的订单状态并未修改。 #2 排查过程# 怀疑是程序的问题,检查乐购系统的执行日志,发现所有日志执行成功,db的插入和更新操作日志以及事务日志,都显示执行正确;【正常】 怀疑是DB执行的问题,检查DB的binglog日志,发现没有事务执行的任何记录,那数据到底是提交到哪里去了呢? 乐购系统的日志明明是显示执行成功的啊。于是怀疑当时db执行可能有错误再检查db的errorlog发现也没有任何db执行错误信息;【正常】 怀疑是db的配置问题,因为我们当时在dev和qa环境下都测试成功,就是boss环境发生这样的奇怪问题。于是检查dev,qa和boss环境的所有配置,包括: bulk_insert_buffer_size 批量插入buffer大小,innodb_flush_log_at_trx_commit 事务提交的日志级别,lock timewait锁等待时间 ,注意这个参数很重要。 默认是5分钟吧,我们设置的是365天!! 【不正常】 发现这三个环境没有db配置没有任何差别,唯一不同的是线上db做了主从配置

数据库开发

别来无恙 提交于 2019-12-04 23:29:15
#死锁分析与解决 ##事务并发执行 ##事务持锁 MySQL数据库是以行加锁的方式,避免不同事务,对同一行数据库进行同时修改的。首先来看事务一,对张三这条记录的Account字段进行修改,需要持有张三这条数据库的行锁。然后事务二也同时并发执行,事务二首先修改李四这条数据库记录的Corp字段,持有李四这条数据库的行锁。 此时两个事务各持有一个行锁,但是接下来事务一要持有事务二的行锁,事务二要持有事务一的行锁。这样就形成了事务一与事务二相互等待,导致两个事务都无法继续执行下去。 ##死锁 死锁 :指 两个 或者 两个以上 的事务,在执行过程中,因 争夺锁资源 而造成的一种 互相等待 的现象。 死锁必须是两个或者两个以上的事务,单个事务不可能发生死锁。死锁是因为争夺锁资源,导致相互持有锁资源,导致相互等待。需要外部干涉的现象。 ##死锁产生的必要条件 互斥 并发执行的事务为了进行必要的隔离保证执行正确,在事务结束前,需要对修改的数据库记录持锁,保证多个事务对相同数据库记录串行修改 对于大型并发系统无法避免 请求与保持 一个事务申请多个资源,已经持有一个资源锁,等待另外一个资源锁 死锁仅发生在请求两个或者两个以上的锁对象 由于应用实际需要,难以消除 不剥夺 已经获得锁资源的事务,在未执行前,不能被强制剥夺,只能使用完时,由事务自己释放。 一般用于已经出现死锁时

spring基于xml的声明式事务控制配置步骤

房东的猫 提交于 2019-12-04 23:29:06
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!--配置业务层--> <bean

mysql 复习

梦想的初衷 提交于 2019-12-04 23:27:04
SQL 什么是SQL? Structured Query Language :结构化查询语言 其实就是定义了操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方,称为“方言”。 SQL通用语法 SQL 语句可以单行或多行书写,以分号结尾。 可使用空格和缩进来增强语句的可读性。 MySQL 数据库的 SQL 语句不区分大小写,关键字建议使用大写。 3 种注释 单行注释: -- 注释内容 或 # 注释内容(mysql 特有) 多行注释: /* 注释 */ SQL分类 1) DDL(Data Definition Language) 数据定义语言 用来定义数据库对象:数据库,表,列等。关键字: create , drop , alter 等 2) DML(Data Manipulation Language) 数据操作语言 用来对数据库中表的数据进行增删改。关键字: insert , delete , update 等 3) DQL(Data Query Language) 数据查询语言 用来查询数据库中表的记录(数据)。关键字: select , where 等 4) DCL(Data Control Language) 数据控制语言(了解) 用来定义数据库的访问权限和安全级别,及创建用户。关键字: GRANT , REVOKE 等 DDL: 操作数据库、表 操作数据库

mysql 事务

两盒软妹~` 提交于 2019-12-04 22:07:20
ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性) 事务就是要保证一组数据库操作,要么全部成功,要么全部失败。在 MySQL 中,事务支持是在引擎层实现的。MySQL 是一个支持多引擎的系统,但并不是所有的引擎都支持事务, MyISAM 引擎就不支持事务。 当数据库上有多个事务同时执行的时候,就可能出现脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)的问题。 隔离级别   隔离得越严实,效率就会越低。因此很多时候,我们都要在二者之间寻找一个平衡点。 读未提交(read uncommitted):一个事务还没提交时,它做的变更就能被别的事务看到。 读提交(read committed):一个事务提交之后,它做的变更才会被其他事务看到。 可重复读(repeatable read):一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的。 串行化(serializable ):串行化,顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。         1. 若隔离级别是

【转载】mysql的三种备份方式

杀马特。学长 韩版系。学妹 提交于 2019-12-04 21:21:01
一、备份的目的 做灾难恢复:对损坏的数据进行恢复和还原 需求改变:因需求改变而需要把数据还原到改变以前 测试:测试新功能是否可用 二、备份需要考虑的问题 可以容忍丢失多长时间的数据; 恢复数据要在多长时间内完; 恢复的时候是否需要持续提供服务; 恢复的对象,是整个库,多个表,还是单个库,单个表。 三、备份的类型 1、根据是否需要数据库离线 冷备(cold backup) :需要关mysql服务,读写请求均不允许状态下进行; 温备(warm backup) : 服务在线,但仅支持读请求,不允许写请求; 热备(hot backup) :备份的同时,业务不受影响。 注: 1、这种类型的备份,取决于业务的需求,而不是备份工具 2、MyISAM不支持热备,InnoDB支持热备,但是需要专门的工具 2、根据要备份的数据集合的范围 完全备份:full backup,备份全部字符集。 增量备份: incremental backup 上次完全备份或增量备份以来改变了的数据,不能单独使用,要借助完全备份,备份的频率取决于数据的更新频率。 差异备份:differential backup 上次完全备份以来改变了的数据。 建议的恢复策略: 完全+增量+二进制日志 完全+差异+二进制日志 3、根据备份数据或文件 物理备份:直接备份数据文件 优点: 备份和恢复操作都比较简单,能够跨mysql的版本,

Mysql(2)

南楼画角 提交于 2019-12-04 21:16:50
数据库事务(Database Transaction): 是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 简单的说:事务就是将一堆SQL(通常是增删改操作)的执行绑在一起,要么都执行成功,要么都执行失败,即都执行成功才算成功,否则就会恢复到这堆SQL执行之前的状态。 事务的四大特性(ACID): (1) 原子性 (Atomicity):事务中所有操作是不可再分割的原子单位。事务中所有操作要么全部执行成功,要么全部执行失败。 (2) 一致性 (Consistency):事务执行后,数据库状态与其它业务规则保持一致。如转账业务,无论事务执行成功与否,参与转账的两个账号金额之和应该是不变的。 (3) 隔离性 (Isolation):隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰。也就是说,在事中务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看到中间状态的数据. (4) 持久性 (Durability):一旦事务提交成功,事务中所有的数据操作都必须被持久化到数据库中,即使提交事务后,数据库马上崩溃,在数据库重启时,也必须能保证通过某种机制恢复数据。 MySQL中的事务: 开启事务:start transaction; 结束事务:commit(提交事务