事务

MySQL:5.6 大事务show engine innodb status故障一例

纵然是瞬间 提交于 2020-03-16 17:26:40
某厂面试归来,发现自己落伍了!>>> 导读: 作者:高鹏(网名八怪),《深入理解MySQL主从原理32讲》系列文的作者。 今天遇到一个朋友的线上问题,大概意思就是说,我有一个线上的大事务大概100G左右,正在做回滚,当前看起来似乎影响了线上的业务,并且回滚很慢,是否可以减轻对线上业务的影响。并且朋友已经取消了双1设置,但是没有任何改观。版本MySQL 5.6首先我们需要知道的是,MySQL并不适合大事务,大概列举一些MySQL中大事务的影响: binlog文件作为一次写入,会在sync阶段消耗大量的IO,会导致全库hang主,状态大多为query end。 大事务会造成导致主从延迟。 大事务可能导致某些需要备份挂起,原因在于flush table with read lock,拿不到MDL GLOBAL 级别的锁,等待状态为 Waiting for global read lock。 大事务可能导致更大Innodb row锁加锁范围,导致row锁等待问题。 回滚困难。 基于如上一些不完全的列举,我们应该在线上尽可能的避免大事务。好了我们下面来进行问题讨论。 一、问题 前面已经说了,我们已经取消了双1设置,所谓的双1就是 sync_binlog=1和 innodb_flush_log_at_trx_commit=1。这两个参数线上要保证为1,前者保证binlog的安全

@Transactional注解

心不动则不痛 提交于 2020-03-16 11:18:09
1.作用简述 br/> 作用由于业务需求,在**Service的方法A中使用一个for循环,每次循环里面的业务可能会发生异常,这个时候需要将循环内的所有数据库操作给回滚掉**,但又不能影响到之前循环里数据的更改,并且后面的循环里不发生异常的情况下也需要正常操作数据库。 **2.用法简述** 为了保证事务的一致性,事务管理对企业应用是至关重要的。Sring支持编程式事务管理和声明式事务管理两种方式。 编程式事务管理两种实现方式:1)TransactionTemplate;2)直接使用底层的PlatformTransactionManager。对于编程式事务管理,Spring推荐使用方式1)。 声明式事务管理建立在AOP之上,其本质是对方法前后进行拦截,然后再目标方法开始之前创建一个或加入一个事务,在执行完目标方法之后,根据情况执行或回滚事务。声明式事务管理也有两种方式:1)基于tx和aop名字空间的xml配置文件;2)基于@Transactional注解。注解方式更简单易用。 3.Transactional注解使用说明 br/> 当作用于类上,该类的所有public方法都具有该事务属性。也可以**作用于方法级别上**。 在项目中,@Transactional(rollbackFor=Exception.class),如果类加了这个注解,那么这个类里面的方法抛出异常,就会回滚

2019JAVASpring面试题集总结

心不动则不痛 提交于 2020-03-16 08:39:03
**什么是 spring?** 答:spring是个 Java企业级应用的开源开发框架。Spring主要用来开发 Java应用,但是有些扩 展是针对构建 J2EE平台的 web应用。 Spring框架目标是简化 Java企业级应用开发,并通过 POJO为基础的编程模型促进良好的编 程习惯 **使用 Spring框架的好处是什么?** 轻量:Spring是轻量的,基本的版本大约 2MB。 控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找 依赖的对象们。 面向切面的编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。 容器:Spring包含并管理应用中对象的生命周期和配置。 MVC框架:Spring的 WEB框架是个精心设计的框架,是 Web框架的一个很好的替代品。 事务管理:Spring提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务 (JTA)。 异常处理:Spring提供方便的 API把具体技术相关的异常(比如由 JDBC,hibernateorJDO 抛出的)转化为一致的 unchecked异常。 **IOC的优点是什么?** 答:IOC 或 依赖注入把应用的代码量降到最低。它使应用容易测试,单元测试不再需要单例和 JNDI查找机制。最小的代价和最小的侵入性使松散耦合得以实现

理解乐观锁与悲观锁

坚强是说给别人听的谎言 提交于 2020-03-16 08:05:44
  DBMS中并发控制的任务是确保多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性   乐观锁和悲观锁是并发控制主要采用的技术手段。   无论是乐观锁还是悲观锁,都是人们定义出来的概念,可以认为是一种思想。其实不仅仅是关系型数据库中有乐观锁和背锅所的盖面,其他很多地方都有类似的概念。   针对不同的业务场景,应该选用不同的并发控制方式,所以,不要把乐观锁和悲观锁下一的理解为DBMS中的概念,更不要把他们和数据库中提供的锁机制混为一谈。其实,在DBMS中,悲观锁正式利用数据库本身的锁机制来实现的。   悲观锁   在关系数据库中,悲观锁是一种并发控制的方法,它可以组织一个事务一影响其他用户的方式来修改数据。如果一个事务执行的操作嗾使某行数据应用了锁,那只有当这个事务把锁释放,其他事务才能够执行与该锁冲突的操作。   悲观锁主要用于数据征用激烈的环境,以及发生并发冲突时使用锁保护数据的成本要低于回滚事务的成本的环境中。   悲观锁指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往一句数据库提供的锁机制(也只有数据库层提供的锁机制擦能真正保证数据访问的排他性,否则,及时在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)   在数据库中

数据库死锁

醉酒当歌 提交于 2020-03-15 23:50:09
在讨论锁之前,可能会引入事务的隔离级别。尴尬的说,有点忘记了。 数据库死锁相对还比较常见,突然也让我想到了 goroutine 的 deadlock 。说下我的理解:死锁,其实是一种无尽的相互等待。 尝试通俗地描述一下死锁的过程: 路人甲和路人乙合租,两人公用一个卫生间 早上,路人甲醒的早,直接去了卫生间,但没有带手纸。想等路人乙醒了之后给他送手纸 路人乙起床后,拿上了手纸,想等路人甲赶紧从卫生间出来 昨晚,线上环境又 deadlock 报警。遗憾的是,虽然我知道发生死锁的原因,但不知道原因的原因。最后还是根据 DBA 同事提供的日志得出了判断。 在分析之前,先通过如下表格,了解一下数据库常见的锁: X IX S IS X Conflict Conflict Conflict Conflict IX Conflict Compatible Conflict Compatible S Conflict Conflict Compatible Compatible IS Conflict Compatible Compatible Compatible 简化描述一下,昨晚线上死锁的情况。下面对语句做了简化: 事务一 update friends set name = "道道法" where id = 1 事务二 update friends set name = "道道法" where

Oracle事务

孤街浪徒 提交于 2020-03-15 11:52:17
目录 一、事务的基本概念 二、事务的特征 1、原子性(Atomicity) 2、一致性(Consistency) 3、隔离性(Isolation) 4、持久性(Durability) 三、事务控制 1、设置事物属性 2、数据异常 3、选择隔离层 4、保存点 四、版权声明 一、事务的基本概念 在数据库中事务是工作的逻辑任务,一个事务是由一个或一组SQL语句组成,通过事务机制确保这一组SQL语句的操作要么全部成功执行成功,完成整个工作任务,如果任何一条SQL执行失败,对数据表所做的操作全部撤销。 事务的目的就是为了保证数据的完整性,以银行转换业务为例: A用户向B转账1000元,步骤如下: 1)A用户账户余额减少1000元; 2)B用户账户余额增加1000元; 3)记录A用户的交易日志。 4)记录B用户的交易日志。 一笔转帐交易将产生四次数据库操作,要么全部都成功,如果有一个失败,其它操作也应该全部被撤销。 转账交易有四次数据库操作,即四条SQL语句,第一条SQL执行的时候是事务的开始,如果全部的SQL语句执行成功,提交事务,如果有任何一条SQL语句执行失败,回滚事务。 commit; -- 提交事务。 rollback; -- 回滚事务。 二、事务的特征 对一组SQL语句操作构成的事务,数据库系统必须保证这些操作的原子性、一致性、隔离性和持久性,即ACID原则。 1、原子性

第六章 异步化与缓存原则

丶灬走出姿态 提交于 2020-03-15 01:47:42
1.业务流程异步化:通过服务异步调用的方式让业务流程中业务逻辑上允许同步执行的服务同时被调用,从而解决大量远程服务线性调用带来的性能问题。 2.数据库事务异步化:大事务拆成小事务,降低数据库的资源被长时间事务锁占用而造成的数据库瓶颈,提升平台的处理吞吐量和事务操作响应时间。 3.CAP理论:一个分布式系统最多只能同时满足一致性、可用性和分区容错性。 (1)一致性:指更新操作成功并返回客服端完成后,所有节点在同一时间的数据完全一致性。 (2)可用性:用户在访问数据时可以得到及时的响应。 (3)分区容错性:分布式系统在遇到某节点或网络分区故障的时候,仍能够对外提供满足一致性和可用性的服务。 4.BASE理论:BASE是指基本可用(Basically Available)柔性状态(Soft State)、最终一致性(Eventual Consistency) (1)基本可用:分布式系统在出现故障的时候,允许损失部分可用性,即保证核心可用。 (2)柔性状态:允许系统存在中间状态,而该中间状态不会影响系统整体可用性 (3)最终一致性:指系统中的所有数据副本经过一定时间后,最终能达到一致的状态。 5.高可用 = 系统构建在多机 = 分布式系统 高性能 = 分布式系统的副产品 6.柔性事务如何解决分布式事务问题 (1)引入日志和补偿机制 (2)可靠消息传递(幂等) (3)实现无锁 7

mysql共享锁与排他锁

对着背影说爱祢 提交于 2020-03-14 23:40:26
mysql锁机制分为表级锁和行级锁,本文就和大家分享一下我对mysql中行级锁中的共享锁与排他锁进行分享交流。 共享锁又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。 排他锁又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。 对于共享锁大家可能很好理解,就是多个事务只能读数据不能改数据,对于排他锁大家的理解可能就有些差别,我当初就犯了一个错误,以为排他锁锁住一行 数据后,其他事务就不能读取和修改该行数据,其实不是这样的。排他锁指的是一个事务在一行数据加上排他锁后,其他事务不能再在其上加其他的锁。mysql InnoDB引擎默认的修改数据语句,update,delete,insert都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁类 型,如果加排他锁可以使用select ...for update语句,加共享锁可以使用select ... lock in share mode语句。所以加过排他锁的数据行在其他事务种是不能修改数据的,也不能通过for update和lock in share mode锁的方式查询数据,但可以直接通过select ..

MySQL性能优化(一):优化方式

若如初见. 提交于 2020-03-14 12:49:34
原文: MySQL性能优化(一):优化方式 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/vbirdbest/article/details/81047715 一:简介 MySQL性能优化是通过优化各个方面的,不仅仅是优化SQL语句这一方面,而是通过各各方面的优化,每个地方优化一些,这样整体性能就会有明显的提升。 二:优化方式 1. 优化数据库表结构的设计 为什么数据库表的设计会影响性能? 字段的数据类型:不同的数据类型的存储和检索方式不同,对应的性能也不同,所以说要合理的选用字段的数据类型。比如人的年龄用无符号的unsigned tinyint即可,没必要用integer 数据类型的长度:数据库最终要写到磁盘上,所以字段的长度也会影响着磁盘的I/O操作,如果字段的长度很大,那么读取数据也需要更多的I/O, 所以合理的字段长度也能提升数据库的性能。比如用户的手机号11位长度,没必要用255个长度。 表的存储引擎:常用的存储引擎有MyISAM、InnoDB、Memory,不同的存储引擎拥有不同的特性,所以要合理的利用每种存储引擎的长处和优点来提供数据的性能。MyISAM不支持事务,表级锁,但是查询速度快,InnoDB支持事务,行锁。 2. SQL优化

锁相关

核能气质少年 提交于 2020-03-14 11:19:55
全局锁(FTWRL) 全局锁就是对整个数据库实例加锁。MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock 。当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。 全局锁的典型使用场景是,做全库逻辑备份。也就是把整库每个表都 select 出来存成文本。 为什么需要FTWRL 官方自带的逻辑备份工具是 mysqldump。当 mysqldump 使用参数 –single-transaction 的时候,导数据之前就会启动一个事务,来确保拿到一致性视图。而由于 MVCC 的支持,这个过程中数据是可以正常更新的。 有了这个功能,为什么还需要 FTWRL 呢?一致性读是好,但前提是引擎要支持这个隔离级别。比如,对于 MyISAM 这种不支持事务的引擎,如果备份过程中有更新,总是只能取到最新的数据,那么就破坏了备份的一致性。这时,我们就需要使用 FTWRL 命令了。所以, single-transaction 方法只适用于所有的表使用事务引擎的库。如果有的表使用了不支持事务的引擎,那么备份就只能通过 FTWRL 方法。这往往是 DBA 要求业务开发人员使用 InnoDB 替代 MyISAM 的原因之一。 表级锁