事务隔离级别

mysql死锁问题分析

亡梦爱人 提交于 2019-12-06 07:25:30
线上某服务时不时报出如下异常(大约一天二十多次):“Deadlock found when trying to get lock;”。 Oh, My God! 是死锁问题。尽管报错不多,对性能目前看来也无太大影响,但还是需要解决,保不齐哪天成为性能瓶颈。 为了更系统的分析问题,本文将从死锁检测、索引隔离级别与锁的关系、死锁成因、问题定位这五个方面来展开讨论。 图1 应用日志 1 死锁是怎么被发现的? 1.1 死锁成因&&检测方法 左图那两辆车造成死锁了吗?不是!右图四辆车造成死锁了吗?是! 图2 死锁描述 我们mysql用的存储引擎是innodb,从日志来看,innodb主动探知到死锁,并回滚了某一苦苦等待的事务。问题来了,innodb是怎么探知死锁的? 直观方法是在两个事务相互等待时,当一个等待时间超过设置的某一阀值时,对其中一个事务进行回滚,另一个事务就能继续执行。这种方法简单有效,在innodb中,参数innodb_lock_wait_timeout用来设置超时时间。 仅用上述方法来检测死锁太过被动,innodb还提供了wait-for graph算法来主动进行死锁检测,每当加锁请求无法立即满足需要并进入等待时,wait-for graph算法都会被触发。 1.2 wait-for graph原理 我们怎么知道上图中四辆车是死锁的?他们相互等待对方的资源,而且形成环路

数据库 锁机制及原理

倾然丶 夕夏残阳落幕 提交于 2019-12-06 05:25:17
转自 https://blog.csdn.net/C_J33/article/details/79487941 数据库锁 先看一张图自己整理的数据库锁的树形图 概要 数据库锁一般可以分为两类,一个是悲观锁,一个是乐观锁。 乐观锁一般是指用户自己实现的一种锁机制,假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。乐观锁的实现方式一般包括使用版本号和时间戳。 悲观锁一般就是我们通常说的数据库锁机制,以下讨论都是基于悲观锁。 悲观锁主要表锁、行锁、页锁。在MyISAM中只用到表锁,不会有死锁的问题,锁的开销也很小,但是相应的并发能力很差。innodb实现了行级锁和表锁,锁的粒度变小了,并发能力变强,但是相应的锁的开销变大,很有可能出现死锁。同时inodb需要协调这两种锁,算法也变得复杂。InnoDB行锁是通过给索引上的索引项加锁来实现的,只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁。 表锁和行锁都分为共享锁和排他锁(独占锁),而更新锁是为了解决行锁升级(共享锁升级为独占锁)的死锁问题。 innodb中表锁和行锁一起用,所以为了提高效率才会有意向锁(意向共享锁和意向排他锁)。 为了表锁和行锁而存在的意向锁 官方文档中是这么描述的,

锁机制

≯℡__Kan透↙ 提交于 2019-12-06 05:24:59
SQL SERVER的锁机制系列: SQL SERVER的锁机制(一)——概述(锁的种类与范围) SQL SERVER的锁机制(二)——概述(锁的兼容性与可以锁定的资源) SQL SERVER的锁机制(三)——概述(锁与事务隔离级别) SQL SERVER的锁机制(四)——概述(各种事务隔离级别发生的影响) 锁定:通俗的讲就是加锁。锁定是 Microsoft SQL Server 数据库引擎用来同步多个用户同时对同一个数据块的访问的一种机制。 定义:当有事务操作时,数据库引擎会要求不同类型的锁定,如相关数据行、数据页或是整个数据表,当锁定运行时,会阻止其他事务对已经锁定的数据行、数据页或数据表进行操作。只有在当前事务对于自己锁定的资源不在需要时,才会释放其锁定的资源,供其他事务使用。 一、锁的种类与范围(如下表) 锁类型 说明 共享 (S) 用于不更改或不更新数据的读取操作,如 SELECT 语句。 更新 (U) 用于可更新的资源中。 防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。 独占(也可称排他)(X) 用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。 确保不会同时对同一资源进行多重更新。 意向 用于建立锁的层次结构。 意向锁包含三种类型:意向共享 (IS)、意向排他 (IX) 和意向排他共享 (SIX)。 架构

分布式系统下,分布式数据库遇到的挑战

ぐ巨炮叔叔 提交于 2019-12-06 04:53:34
分布式系统下,分布式数据库遇到的挑战   分布式系统下,当访问关系型数据库的i/o占用过高,内存不足,访问过慢的情况下,可以考虑流流行的分库分表的策略,但是这样也会到来很多新的技术挑战。 1.分布式事务   当还是单体应用,单体数据库时,完全不需要考虑事务的一致性问题,因为mysql已经帮我们处理事务问题(ACID),但是这只是针对单体情况下,如果是多个数据库,主从备份,读写分离,那么就会可能造成事务不一致的情况,那么什么事分布式事务,分布式   事务又该如何解决呢?      1.有关于事务的概念     本地事务:本地事务的优点就是支持严格的ACID特性,高效,可靠,状态可以只在资源管理器中维护,而且应用编程模型简单。     全局事务:当事务由全局事务管理器进行全局管理时成为全局事务,事务管理器负责管理全局的事务状态和参与的资源,协同资源的一致提交回滚。     两阶段事务:两阶段事务提交采用的是X/OPEN组织所定义的 DTP模型 ,通过抽象出来的 AP , TM , RM 的概念可以保证事务的强一致性。 其中 TM 和 RM 间采用 XA 的协议进行双向通信。 与传统的本地事务相比,           XA事务增加了prepare阶段,数据库除了被动接受提交指令外,还可以反向通知调用方事务是否可以被提交。 因此 TM 可以收集所有分支事务的prepare结果

JavaWeb_(Spring框架)Spring整合Hibernate

本秂侑毒 提交于 2019-12-06 04:34:23
  Dao层类要继承HibernateDaoSupport.java父类   原先使用Hibernate框架hibernate.cfg.xml配置数据库 <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///spring</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connecton.password">123456</property> <!-- 数据库的方言 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property> <!-- 是否显示sql语句 --> <property name="hibernate.show_sql">true</property> <!-- 是否格式化sql语句 -->

数据库一致性的理解

邮差的信 提交于 2019-12-06 03:08:54
一致性是指数据处于一种语义上的有意义且正确的状态。一致性是对数据可见性的约束,保证在一个事务中的多次操作的数据中间状态对其他事务不可见的。因为这些中间状态,是一个过渡状态,与事务的开始状态和事务的结束状态是不一致的。   举个粒子,张三给李四转账100元。事务要做的是从张三账户上减掉100元,李四账户上加上100元。一致性的含义是其他事务要么看到张三还没有给李四转账的状态,要么张三已经成功转账给李四的状态,而对于张三少了100元,李四还没加上100元这个中间状态是不可见的。   那么反驳的声音来了:   要么转账操作全部成功,要么全部失败,这是原子性。从例子上看全部成功,那么一致性就是原子性的一部分咯,为什么还要单独说一致性和原子性?   你说的不对。在未提交读的隔离级别下是事务内部操作是可见的,明显违背了一致性,怎么解释?   好吧,需要注意的是: 原子性和一致性的的侧重点不同: 原子性关注状态,要么全部成功,要么全部失败,不存在部分成功的状态。 而 一致性关注数据的可见性,中间状态的数据对外部不可见,只有最初状态和最终状态的数据对外可见   隔离性是多个事物的时候, 相互不能干扰,一致性是要保证操作前和操作后数据或者数据结构的一致性,而我提到的事务的一致性是 关注 数据的中间状态,也就是一致性需要监视中间状态的数据,如果有变化,即刻回滚 (一系列操作后

spring 学习笔记

亡梦爱人 提交于 2019-12-06 03:01:10
闲话 最近简单的学习了一下 springboot,记录下自己的一些学习心得,没有体系,没有深入讲解,基本只涉及到一些概念级,权当随笔记录。。他日翻看时,希望能有所帮助,肯定也有理解不到位之处,还请大家指正 为什么会有 spring 学习一项技术,我们首先需要弄明白,这项技术出现的意义是什么,它能够解决什么场景问题,知其然,必先知其所以然 一般大型的企业级java应用,都会包含很多的内容模块,包括各种接口、逻辑、页面、存储等,它们之间可能存在复杂的依赖关系,如何对他们进行统一的管理和调度是影响开发效率的重要因素 容器化管理我们的应用程序,是上述问题的通用解决方案:应用的开发针对 pojo、bean或者组件,然后交由容器去负责组装调用,实现解耦 在spring之前,java官方推荐的解决方案是 EJB,但是 EJB 是一个非常重型的框架,上手成本很高,对于中小型的企业应用支持并友好 于是民间组织在 EJB 的容器化管理的基础上,创建了 spring,相对来说更轻量级的开发框架,简单对比 EJB 的话,他俩的优缺点: EJB 面向的是组件级容器管理,spring 则是 bean 的管理,更细粒度,对于开发的理解更容易 EJB 和 spring 都支持 ioc 和 aop,但是 spring 封装的功能更强大简单,早期spring只支持xml配置方式,ejb只支持注解方式,随着发展

轻松理解MYSQL MVCC 实现机制

久未见 提交于 2019-12-06 02:24:38
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/whoamiyang/article/details/51901888 1. MVCC简介 1.1 什么是MVCC MVCC是一种多版本并发控制机制。 1.2 MVCC是为了解决什么问题? 大多数的MYSQL事务型存储引擎,如,InnoDB,Falcon以及PBXT都不使用一种简单的行锁机制.事实上,他们都和MVCC–多版本并发控制来一起使用. 大家都应该知道,锁机制可以控制并发操作,但是其系统开销较大,而MVCC可以在大多数情况下代替行级锁,使用MVCC,能降低其系统开销. 1.3 MVCC实现 MVCC是通过保存数据在某个时间点的快照来实现的. 不同存储引擎的MVCC. 不同存储引擎的MVCC实现是不同的,典型的有乐观并发控制和悲观并发控制. 2.MVCC 具体实现分析 下面,我们通过InnoDB的MVCC实现来分析MVCC使怎样进行并发控制的. InnoDB的MVCC,是通过在每行记录后面保存两个隐藏的列来实现的,这两个列,分别保存了这个行的创建时间,一个保存的是行的删除时间。这里存储的并不是实际的时间值,而是系统版本号(可以理解为事务的ID),没开始一个新的事务,系统版本号就会自动递增

MySQL的四种事务隔离级别

北战南征 提交于 2019-12-06 02:23:15
本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一、事务的基本要素(ACID)    1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。    2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。    3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。    4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。 二、事务的并发问题   1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据   2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。   3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级

Spring中的事务回滚机制

房东的猫 提交于 2019-12-06 00:47:13
初学者笔记 问题:在Java项目汇中,添加@Transactional注解,报错之后,事务回滚未生效,数据仍插入数据库中.经查看报错位置位于新增成功之后.空指针异常. 一、特性 先了解一下@Transactional注解事务的特性,可以更好排查问题 1、service类标签(一般不建议在接口上)上添加@Transactional,可以将整个类纳入spring事务管理,在每个业务方法执行时都会开启一个事务,不过这些事务采用相同的管理方式。 2、@Transactional 注解只能应用到 public 可见度的方法上。 如果应用在protected、private或者 package可见度的方法上,也不会报错,不过事务设置不会起作用。 3、默认情况下,Spring会对unchecked异常进行事务回滚;如果是checked异常则不回滚。 辣么什么是checked异常,什么是unchecked异常 java里面将派生于Error或者RuntimeException(比如空指针,1/0)的异常称为unchecked异常,其他继承自java.lang.Exception得异常统称为Checked Exception,如IOException、TimeoutException等   通俗一点:你写代码出现的空指针等异常,会被回滚,文件读写,网络出问题,spring就没法回滚了