事务管理

Innodb学习(一)

只愿长相守 提交于 2019-11-29 23:41:32
InnoDB 后台线程 master thread io thread 4四种io线程类型:insert buffer thread,log thread,read thread,write thread innodb使用了大量异步io处理写io请求 io thread的工作是负责这些io请求的回调处理 purge thread 回收已使用的、不再需要的undo页 page cleaner thread 刷脏页 内存 缓存池 磁盘读到的页放入缓存池,下次读取相同页时先判断缓存中是否存在 页的修改,先修改缓存池中的页,再以一定频率刷回磁盘。不是每次页更新时就刷盘,而是通过checkpoint机制 缓存的数据页类型 索引页,数据页,undo页,insert buffer,自适应哈希索引,锁信息,数据字典信息 内存区域的管理 LRU List:lru算法,midpoint,最近访问的页放入到lru列表的midpoint位置,默认是lru列表的5/8处 为啥不用朴素lru算法? 防止某些sql操作可能会使缓存池中的页被刷出lru列表,影响缓存池效率。 如索引或数据的扫描操作。这些扫描到的页通常仅在一次查询中需要,不是活跃的热点数据 unzip_LRU列表 伙伴算法 Free List: Flush List redo log_buffer redo日志信息先放在这里

大型系统设计核心技术(第二篇)---分布式事务处理方案

放肆的年华 提交于 2019-11-29 23:13:51
开发单体应用时,相信大家都有使用过数据库的 本地事务 ,也就是在同一个数据库中,可以允许一组操作要么全都正确执行,要么全都不执行。这里特别指出了本地事务,也就是说明数据库事务只支持同一个数据库的操作。可随着技术和业务发展,一方面随着系统业务量增大,数据库存储东西越来越多。当达到一定数据量时,为了应对高并发,就会出现分库分表需求。另一方面,随着服务化方案的推广,越来越多的公司团队将原有的大项目拆分成一个个小应用,这也使得跨应用(JVM)数据库场景出现。可是目前数据库不支持跨库事务,我们应该如何实现分布式事务呢?本文首先会为大家梳理分布式事务的基本概念和理论基础,然后介绍几种目前常用的分布式事务解决方案。 一、定义 百度百科给出的定义:“分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。”简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败。本质上来说,分布式事务就是为了保证不同数据库的数据一致性。 二、事务的四大特性 ACID 1.原子性 原子性要求,事务是一个不可分割的执行单元,事务中的所有操作要么全都执行,要么全都不执行。 2.一致性 一致性要求,事务在开始前和结束后,数据库的完整性约束没有被破坏。 3.隔离性

Java面试题架构篇分布式事务

拟墨画扇 提交于 2019-11-29 23:11:57
目录 前言 分布式事务方案 强一致性 2PC 两阶段提交(XA事务,阻塞) 3PC三阶段提交(非阻塞,引入超时和准备阶段) TCC模式-本质也是2PC Saga模式 最终一致性(BASE理论) 本地消息表 MQ消息队列 Paxos Raft ZAB 协议 ( Zookeeper Atomic Broadcast) 原子广播协议 总结 前言 如果只有一个数据库,所有的逻辑都在一个db完成,那么本地事务很简单就可以处理。但是,在微服务架构中,功能服务化,服务拆分化,一个业务逻辑很可能需要多个service完成,每个service操作不同的数据库,分布式事务需要一套方案来实现,本文就来集中讲述一下分布式事务的常见方案。 比如我们支付宝余额转入到余额宝,支付宝余额和余额宝是不同的服务,再比如跨行转账,从你的工商银行账户A转1000到建设银行账户B,比如订单系统和库存系统,其实有些情况下不一定要利用分布式事务,能避免尽力避免,主要看业务场景的需要,究竟是强一致性,弱一致性,还是最终一致性。 电商系统常见的例子:订单支付的时候使用红包或者优惠券,必需同时成功或者失败 常见对分布式事务场景: 跨库事务 分库分表,分库分表之后,一般可以利用mycat等数据库中间件简化开发,但是数据库中间件也面临分布式事务的问题 SOA架构(跨应用) 分布式事务方案 强一致性 2PC 两阶段提交(XA事务,阻塞)

分布式事务分析

你说的曾经没有我的故事 提交于 2019-11-29 23:01:18
近期公司项目基于微服务架构需要涉及到实现一套分布式事务。经过几天在网上查阅资料发现大部分文章只是讲解了具体的其中一个模型。因此在这里做一个总结+自己的一些感悟和看法。 1.CAP理论 CAP理论本身并不是一套和事务相关的理论,而是用来解释分布式系统的理论。但是用来分析分布式事物的边界非常适合。关于CAP理论,可以查看阮一峰大神的这篇文章: CAP定理的含义 CAP理论一个核心论证就是P(分区容错性)作为一个分布式系统是肯定包含的。因此实际实现只是在CP和AP之间做抉择。 CP:为了保证一致性和分区容错性,那么肯定会丧失一部分可用性。 AP:为了保证可用性和分区容错性,那么肯定会丧失一部分一致性。 2.ACID原则 ACID原则是用来描述一个事务应该包含的特性。原子性、一致性、隔离性、持久性。这个原则实际上和CAP理论是相悖的。 3.刚性事务、CP模式、XA协议 我们来假设一个简单的支付场景, 生成订单--->扣用户积分--->核销优惠劵--->修改订单状态 。这里涉及三个系统,订单系统、用户积分系统、优惠劵系统。那么如果我们要保证事务的一致性,我们在其中的每一步都会将资源锁定,然后只有在最终事务全部完成后,我们才能释放锁。那么在整个事务周期内我们的功能必定是处于不可用状态。这也正符合 CP定义 。这么做的事务确实可以保证事务的ACID原则,但是因为锁定时间长、锁粒度大(锁定资源多)

MySQL高级阶段学习

大憨熊 提交于 2019-11-29 21:59:40
数据库分区、分表、分库、分片 分区 数据库分区是一种物理数据库的设计技术,它的目的是为了在特定的SQL操作中减少数据读写的总量以缩减响应时间。 分区并不是生成新的数据库表,而是将表的数据均匀分摊到不同的硬盘,系统或不同服务器存储介子中,实际上还是一张表。另外,分区可以做到将表的数据分摊到不同的地方,提高数据检索的效率,降低数据库频繁IO压力值,分区的优点如下: 相对于单个文件系统或硬盘,分区可以存储更多的数据。 数据管理比较方便,如要清理或废弃某年的数据,就可以直接删除该日期的分区数据即可。 精准定位分区查询数据,不需要全表扫描查询,大大提高检索效率。 可跨多个分区磁盘查询,来提高查询的吞吐量。 在涉及聚合函数时,很容易进行数据的合并。 水平分区 这种形式分区是对表的行进行分区,通过这种的方式不同分组里面的物理列分割的数据集得以组合,从而进行个体分体或集体分割。所有在表中定义的列在每个数据集中都能找到,所以表的特性得以保持。 举例:一个包含十年发票记录的表可以被分区为10个不同的分区,每个分区包含的是其中一年的记录。 垂直分区 这种分区方式一般来说是通过对表的垂直划分来减少目标表的宽度,使某些特定的列被划分到特定的分区,每个分区都包含了其中的列所对应的行。 举例:一个包含了大text和blob列的表,这些text和blod列又不经常被访问

oracle查看被锁的表和解锁

佐手、 提交于 2019-11-29 21:30:52
oracle查看被锁的表和解锁 --以下几个为相关表 SELECT * FROM v$lock; SELECT * FROM v$sqlarea; SELECT * FROM v$session; SELECT * FROM v$process ; SELECT * FROM v$locked_object; SELECT * FROM all_objects; SELECT * FROM v$session_wait; --查看被锁的表 select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects b where b.object_id = a.object_id; --查看那个用户那个进程照成死锁 select b.username,b.sid,b.serial#,logon_time from v$locked_object a,v$session b where a.session_id = b.sid order by b.logon_time; --查看连接的进程 SELECT sid, serial#, username, osuser FROM v$session; --3.查出锁定表的sid, serial#,os_user_name,

SpringBoot事务

旧时模样 提交于 2019-11-29 21:25:20
重要概念 自动提交模式 对于mysql数据库,默认情况下,数据库处于自动提交模式。每一条语句处于一个单独的事务中,在这条语句执行完毕时,如果执行成功则隐式的提交事务,如果执行失败则隐式的回滚事务。对于正常的事务管理,是一组相关的操作处于一个事务之中,因此必须关闭数据库的自动提交模式,下面是查看方式: 查看是否自动提交命令(ON表示开启自动提交,值为1,OFF表示关闭自动提交,值为0): show variables like 'autocommit'; 关闭自动提交后,则用户将一直处于某个事务中,直到执行一条commit提交或rollback语句才会结束当前事务重新开始一个新的事务。 DataSource connection = masterDataSource.getConnection(); connection.setAutoCommit(false); 事务隔离级别 隔离级别是指若干个并发的事务之间的隔离程度。TransactionDefinition 接口中定义了五个表示隔离级别的常量: TransactionDefinition.ISOLATION_DEFAULT:这是默认值,表示使用底层数据库的默认隔离级别。对大部分数据库而言,通常这值就是TransactionDefinition.ISOLATION_READ_COMMITTED。

mysql事务

|▌冷眼眸甩不掉的悲伤 提交于 2019-11-29 19:59:10
1. 事务的基本介绍 1. 概念: * 如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。 2. 操作: 1. 开启事务: start transaction; 2. 回滚:rollback; 3. 提交:commit; 3. 例子: CREATE TABLE account ( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(10), balance DOUBLE ); -- 添加数据 INSERT INTO account (NAME, balance) VALUES ('zhangsan', 1000), ('lisi', 1000); SELECT * FROM account; UPDATE account SET balance = 1000; -- 张三给李四转账 500 元 -- 0. 开启事务 START TRANSACTION; -- 1. 张三账户 -500 UPDATE account SET balance = balance - 500 WHERE NAME = 'zhangsan'; -- 2. 李四账户 +500 -- 出错了... UPDATE account SET balance = balance + 500 WHERE NAME = 'lisi'; --

mysql事务的使用

混江龙づ霸主 提交于 2019-11-29 19:17:11
事务的目的: (1) 为了保证的数据的安全. 比如:转钱的场景,A转给B 100, A-100,B+100有两步操作,开启事务后两步骤都完成才会完整的写入数据库,否则执行回滚操作回到原始状态。 (2) 涉及多张表的操作时候(比如表是有关联的) 删除这种有关联的,如果某张表删除数据出错,那前面已经删除的关联表就没数据了,下次删除就又可能出现其它问题,所以通过事务可以解决这个问题,要么都删除成功,要不都不动。 事务的介绍: MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务! 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。 事务用来管理 insert,update,delete 语句。 一般来说,事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。 4个条件介绍: 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节

MySQL数据库(SQL语句、JDBC、连接池)

南笙酒味 提交于 2019-11-29 19:12:19
MySQL数据库 概念 用于存储和管理数据的仓库。 特点: 1、持久化存储数据的,就是一个文件系统。 2、方便存储和管理数据 3、方便了统一的方式操作数据库---SQL cmd启动MySQl 使用管理员打开cmd net start mysql 启动MySQL服务器 net stop mysql 关闭MySQL服务器 MySQL登录; mysql -uroot -proot -p连接的密码 mysql -uIP地址 -p连接目标密码 mysql --host=ip --user=root --password=连接目标的密码 MySQL退出; exit quit SQL 什么是SQL: Structured Query Language 结构化查询语言 其实就是定义了操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方,称为“方言”。 SQl分类 DDL(Data Definition Language)数据定义语言 用来定义数据库对象:数据库,表,列表。关键字:create,drop,alter等 操作数据库:CRUD C(create)创建 创建数据库格式: create database 数据库名称; 创建数据库,判断不存在,在创建: create database if not exists 数据库名称; 创建数据库,并指定字符集: create