事务隔离级别

mysql之事务

跟風遠走 提交于 2020-03-24 09:13:49
我们为什么要使用数据库的事务呢?使用事务有什么缺点呢? 使用原因:保持数据的匹配和一致性。 缺点: 并发操作中过度使用事务影响性能,因为事务用到了锁技术。 我是李福春,今天我们来复习一下事务的特性。 你可以收获下图中的知识点。 下面我们发散一下。 事务特性 原子性: 要么全部成功要么全部失败 一致性: 保证事务的前后一致性 隔离性:事物之间的执行不能互相干扰 持久性: 事务终结的标志,内存的数据持久化到硬盘中 并发场景下事务出现的问题 脏读: 不可重复读 幻读: 依赖id的自增做为依据。 隔离级别 读未提交 隔离度最弱 脏读 不可重复度 幻读 读已提交 不可重复度 幻读 可重复读 数据库默认 幻读 可串行化 性能最低 没有问题 innodb mvcc 不能解决幻读 如何跟合理的使用事务 没有数据一致性要求场景 不使用事务 只有查询的场景: 不需要使用事务 更新记录表,然后更新统计表 不要使用事务, 使用事务触发或者定时任务; 内容繁杂的大事务 分拆成各种小事务,各种反向操作辅助 原创不易,转载请注明出处。 来源: https://www.cnblogs.com/snidget/p/12556761.html

并发操作的一致性问题

时光怂恿深爱的人放手 提交于 2020-03-23 13:13:54
2.2.1 并发一致性问题 常见并发并发一致性问题包括:丢失的修改、不可重复读、读脏数据、幻影读(幻影读在一些资料中往往与不可重复读归为一类)。 2.2.1.1 丢失修改 下面我们先来看一个例子,说明并发操作带来的数据的不一致性问题。 考虑飞机订票系统中的一个活动序列: 甲售票点(甲事务)读出某航班的机票余额A,设A=16. 乙售票点(乙事务)读出同一航班的机票余额A,也为16. 甲售票点卖出一张机票,修改余额A←A-1.所以A为15,把A写回数据库. 乙售票点也卖出一张机票,修改余额A←A-1.所以A为15,把A写回数据库. 结果明明卖出两张机票,数据库中机票余额只减少1。 归纳起来就是:两个事务T1和T2读入同一数据并修改,T2提交的结果破坏了T1提交的结果,导致T1的修改被丢失。前文(2.1.4数据删除与更新)中提到的问题及解决办法往往是针对此类并发问题的。但仍然有几类问题通过上面的方法解决不了,那就是: 2.2.1.2 不可重复读 不可重复读是指事务T1读取数据后,事务T2执行更新操作,使T1无法再现前一次读取结果。具体地讲,不可重复读包括三种情况: 事务T1读取某一数据后,事务T2对其做了修改,当事务1再次读该数据时,得到与前一次不同的值。例如,T1读取B=100进行运算,T2读取同一数据B,对其进行修改后将B=200写回数据库。T1为了对读取值校对重读B,B已为200

事物隔离级别与传播特性

北城以北 提交于 2020-03-23 12:12:06
Spring声明式事务让我们从复杂的事务处理中得到解脱。使得我们再也无需要去处理获得连接、关闭连接、事务提交和回滚等这些操作。再也无需要我们在与事务相关的方法中处理大量的try…catch…finally代码。 我们在使用Spring声明式事务时,有一个非常重要的概念就是事务属性。事务属性通常由事务的传播行为,事务的隔离级别,事务的超时值和事务只读标志组成。我们在进行事务划分时,需要进行事务定义,也就是配置事务的属性。 Spring在 TransactionDefinition 接口中定义这些属性,以供PlatfromTransactionManager使用, PlatfromTransactionManager是spring事务管理的核心接口。 Java代码 TransactionDefinition public interface TransactionDefinition { int getPropagationBehavior(); int getIsolationLevel(); int getTimeout(); boolean isReadOnly(); } getTimeout()方法,它返回事务必须在多少秒内完成。 isReadOnly(),事务是否只读,事务管理器能够根据这个返回值进行优化,确保事务是只读的。 getIsolationLevel(

理解MySQL——架构与概念

我的梦境 提交于 2020-03-23 12:10:40
写在前面:最早接触的MySQL是在三年前,那时候MySQL还是4.x版本,很多功能都不支持,比如,存储过程,视图,触发器,更别说分布式事务等复杂特性了。但从5.0(2005年10月)开始,MySQL渐渐步入企业级数据库的行列了;复制、集群、分区、分布式事务,这些企业级的特性,使得现在的MySQL,完全可以应用于企业级应用环境(很多互联网公司都用其作为数据库服务器,尽管节约成本是一个因素,但是没有强大功能作后盾,则是不可想象的)。虽然,MySQL还有很多不足,比如,复制、分区的支持都十分有限、查询优化仍需要改进,但是MySQL已经是一个足够好的DBMS了,更何况它是opensource的。这段时间没有事,出于好奇,略微的研究了一下MySQL,积累了一些资料,欲总结出来。这些资料打算分为两部分,上部主要讨论MySQL的优化,其中主要参考了《MySQL Manual》和《High Performance MySQL》,如果有时间,以后在下部分析一下MySQL的源码。如果你是MySQL高手,希望你不吝赐教;如果你是新手,希望对你有用。 第一章、MySQL架构与概念 1、MySQL的逻辑架构 最上面不是MySQL特有的,所有基于网络的C/S的网络应用程序都应该包括连接处理、认证、安全管理等。 中间层是MySQL的核心,包括查询解析、分析、优化和缓存等。同时它还提供跨存储引擎的功能

面试总结——数据库篇

旧街凉风 提交于 2020-03-21 07:30:03
前言:前面介绍了Java、JVM相关方面的题目,该篇介绍数据库方面相关的题目,这里数据库为MySql,因为笔者或朋友在面试过程中都是涉及MySql的相关知识点。 数据库篇 在数据库题目中,由于现在大部分公司都是使用MySql作为数据库,因此笔者及其朋友所遇到的问题也都是MySql相关的知识点。 1)MySql中索引的基本定义,优劣势,以及索引优化。 索引是帮助Mysql高效获取数据的 数据结构 ,因此,索引的 本质 就是数据结构,索引的目的在于提高 查询 效率,可类比字典。 索引: 排好序的快速查找的数据结构。 用途: 排序 + 快速查找 。注意,是两种功能。 数据库除了存储数据本身之外,还维护着一个满足特定查找算法的数据结构,这些数据结构以某种方式指向数据,这样就可以在这些数据结构的基础上实现高级查找算法,这种 数据结构 就是索引。 MySql索引通常是指 B+树 索引。 索引优势: 类似书籍的目录,提高数据检索的效率,降低数据库的 IO 成本(因为数据最终是存储在 磁盘 上的)。 通过索引列对数据进行排序,降低数据排序的成本,降低了 CPU 的消耗(因为排好序,查询速度增加)。 索引劣势: 索引也是 一张表 ,保存了主键与索引字段,并指向实体表的记录,所以索引列也是要 占用磁盘空间的 。 虽然提高了 查询速度 ,但是会 降低更新速度(因为数据更新后,需要重新对索引排序) ,如

Mysql学习之事务的隔离性

血红的双手。 提交于 2020-03-21 06:11:45
今天咱们说说事务,相信大家都知道事务的 ACID (Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性)。 原子性:表示一个事务不可在分割,而且事务中的操作要么一起成功,要么一起失败; 一致性:表示事务前后数据的完整性必须保持一致; 持久性:表示事务一旦进行提交,那么数据的就改便会永久保存,即使数据库出现宕机也不会任何影响。 前面三个很好理解,那咱们再说说事务的隔离性, 事务的隔离就是表示事务与事务之间不会相互干扰 。但是多事务的情况下,还是很容易出现脏读、不可重复读以及幻读的问题。我们简单的解释一下这几个词, 脏读:当数据库中一个事务A正在修改一个数据但是还未提交或者回滚,另一个事务B 来读取了修改后的内容并且使用了,之后事务A提交了,此时就引起了脏读。 此情况仅会发生在: 读未提交的的隔离级别. 不可重复读:在一个事务A中多次操作数据,在事务操作过程中(未最终提交),事务B也才做了处理,并且该值发生了改变,这时候就会导致A在事务操作的时候,发现数据与第一次不一样了。 就是不可重复读。 此情况仅会发生在:读未提交、读提交的隔离级别. 幻读:一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为幻读。幻读是指当事务不是独立执行时发生的一种现象

Java中DAO的实现

时光怂恿深爱的人放手 提交于 2020-03-21 01:20:12
J2EE 开发人员使用数据访问对象(Data Access Object DAO)设计模式,以便将低级别的数据访问逻辑与高级别的业务逻辑分离。实现 DAO 模式涉及比编写数据访问代码更多的内容。在本文中,Java 开发人员 Sean C. Sullivan 讨论了 DAO 编程中三个常常被忽略的方面:事务界定、异常处理和日志记录。 图 1 显示了应用程序和数据源之间的关系: 图 1. 应用程序和数据源 在整个应用程序中使用数据访问对象(DAO)使我们可以将底层数据访问逻辑与业务逻辑分离开来。我们构建了为每一个数据源提供 CRUD (创建、读取、更新、删除)操作的 DAO 类。 在本文中,我将为您介绍构建更好的 DAO 类的 DAO 实现策略和技术。更确切地说,我将讨论日志、异常处理和事务界定。您将学到如何将这三者结合到自己的 DAO 类中。本文假定您熟悉 JDBC API、SQL 和关系数据库编程。 我们将以对 DAO 设计模式和数据访问对象的概述开始。 DAO基础 DAO 模式是标准 J2EE 设计模式之一。开发人员用这种模式将底层数据访问操作与高层业务逻辑分离开。一个典型的 DAO 实现有以下组件: 一个 DAO 工厂类 一个 DAO 接口 一个实现了 DAO 接口的具体类 数据传输对象(有时称为值对象) 具体的 DAO 类包含访问特定数据源的数据的逻辑

理解MySQL——架构与概念

末鹿安然 提交于 2020-03-20 18:28:59
写在前面:最早接触的MySQL是在三年前,那时候MySQL还是4.x版本,很多功能都不支持,比如,存储过程,视图,触发器,更别说分布式事务等复杂特性了。但从5.0(2005年10月)开始,MySQL渐渐步入企业级数据库的行列了;复制、集群、分区、分布式事务,这些企业级的特性,使得现在的MySQL,完全可以应用于企业级应用环境(很多互联网公司都用其作为数据库服务器,尽管节约成本是一个因素,但是没有强大功能作后盾,则是不可想象的)。虽然,MySQL还有很多不足,比如,复制、分区的支持都十分有限、查询优化仍需要改进,但是MySQL已经是一个足够好的DBMS了,更何况它是opensource的。这段时间没有事,出于好奇,略微的研究了一下MySQL,积累了一些资料,欲总结出来。这些资料打算分为两部分,上部主要讨论MySQL的优化,其中主要参考了《MySQL Manual》和《High Performance MySQL》,如果有时间,以后在下部分析一下MySQL的源码。如果你是MySQL高手,希望你不吝赐教;如果你是新手,希望对你有用。 第一章、MySQL架构与概念 1、MySQL的逻辑架构 最上面不是MySQL特有的,所有基于网络的C/S的网络应用程序都应该包括连接处理、认证、安全管理等。 中间层是MySQL的核心,包括查询解析、分析、优化和缓存等。同时它还提供跨存储引擎的功能

hibernate原理解析

北城以北 提交于 2020-03-19 19:55:59
1.hibernate的常用接口 (1) Configucation:负责加载Hibernate的配置及映射信息,启动Hibernate,根据连接到数据库的信息来创建 SessionFactory对象。 (2) SessionFactory: 初始化Hibernate,创建Session对象。他是线程安全的,通常采用单子模式创建此对象。 (3)Session :负责保存·修改·删除·查询·加载对象,这个session不是线程安全的,使用Threadlocal来得到session (相当于创建了一个副本)。 (4)Transaction: 事务处理 开启事务的方法 Transaction tx= session.beginTransaction(); 提交事务 tx.commit(); (5) Query和Criteria:Query是执行数据库查询,Query接口包装了一个HQL语句,HQL语句是面向对象的,它引用类名 和属性名, 而不是表名和字段名。Criteria完全封装了基于字符串形式的查询语句,比Query接口更加面向对象,擅长 动态查询。 2.hibernate体系结构 3.hibernate的工作原理 (1)hibernate如何连接数据库? 配置文件Hibernate.cfg.xml文件中定义了和数据库进行连接的信息,包括数据库方言.jdbc驱动.用户名

MySQL基础篇(06):事务管理,锁机制案例详解

℡╲_俬逩灬. 提交于 2020-03-19 07:19:00
本文源码: GitHub·点这里 || GitEE·点这里 一、锁概念简介 1、基础描述 锁机制核心功能是用来协调多个会话中多线程并发访问相同资源时,资源的占用问题。锁机制是一个非常大的模块,贯彻MySQL的几大核心难点模块:索引,锁机制,事务。这里是基于MySQL5.6演示的几种典型场景,对面MySQL这几块问题时,有分析流程和思路是比较关键的。在MySQL中常见这些锁概念:共享读锁、排它写锁 ; 表锁、行锁、间隙锁。 2、存储引擎和锁 MyISAM引擎:基于读写两种模式,支持表级锁 ; InnoDB引擎:支持行级别读写锁,跨行的间隙锁,InnoDB也支持表锁 ; 3、锁操作API LOCK TABLE name [READ,WRITE] ;加表锁 UNLOCK TABLES ; 释放标所 二、MyISAM锁机制 1、基础描述 MySQL的表级锁有两种模式:共享读锁(Read-Lock)和排它写锁(Write-Lock)。针对MyISAM表的读操作,不会阻塞其他线程对同一表的读请求,但阻塞对同一表的写请求;针对MyISAM表的写操作,会阻塞其他线程对同一表的读和写操作;MyISAM引擎读写操作之间,以及写与写操作之间是串行化。当一次会话线程获取表的写锁后,只有当前持有锁的会话线程可以对表进行操作。其它线程的读、写操作都会等待,直到锁被释放为止。 2、验证案例