事务隔离级别

MySQL重要知识点(总结)

拥有回忆 提交于 2020-02-24 20:29:00
最近一段时间都学习mysql,将重要的知识点总结如下: 一、字段、表、索引设计规范相关 二、事务相关 三、锁相关 四、存储引擎相关 五、大表优化相关 六、索引优化相关 七、语句优化相关 一、字段、表、索引设计规范 1、字段设计规范 ① 字段类型优先选择符合存储需要的最小类型 字段类型优先级:整型>date;time >enum>char;varchar>blob 原因:整型,time运算快,节省内存;enum列内部是用整型存储的,char,varchar要考虑字符集的转换和排序的校对集,速度慢;blob无法使用临时表。 ② 够用就行(如smallint,varchar(N)) 原因:大的字段浪费内存,影响速度,如varchar(10),varchar(300),虽然存储的内容一样,但是,在表联查时,varchar(300)要花更多内存 ③ 尽量避免使用允许为null() 原因:null不利于索引,要用特殊的字节标注,在磁盘上占的空间其实更大 例子:建两个相同字段的表,一个允许为null,一个不允许。可以发现为null的索引更大些。 ④ 避免使用ENUM类型 修改ENUM值需要使用ALTER语句 ENUM类型的ORDER BY操作效率低,需要额外操作 禁止使用数值作为ENUM的枚举值 ⑤ 使用TIMESTAMP(4个字节)或DATETIME类型(8个字节)存储时间 TIMESTAMP

05. Spring的事务管理

人盡茶涼 提交于 2020-02-24 04:51:23
Spring的事务管理 1. 事务管理核心接口 1.1 PlatformTransactionManager 1.2 TransactionDefinition 1.3 TransactionStatus 1.4 事务管理的方式 2. 声明式事务管理 2.1 基于XML方式的声明式事务 2.2 基于Annotation方式的声明式事务 1. 事务管理核心接口 在Spring的所有JAR包中,包含一个名为spring-tx-4.3.6.RELEASE的JAR包,该包就是Spring提供的用于事务管理的依赖包。 在该JAR包的org.springframework.transaction包中,我们可以找到3个接口文件PlatformTransactionManager、TransactionDefinition和TransactionStatus 1.1 PlatformTransactionManager PlatformTransactionManager接口是Spring提供的平台事务管理器,主要用于管理事务。该接口中提供了3个事务操作的方法,具体如下。 TransactionStatus getTransaction(TransactionDefinition definition):用于获取事务状态信息。· void commit(TransactionStatus

mysql的事务隔离级别

痞子三分冷 提交于 2020-02-23 13:53:01
什么是事务   事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。   事务的结束有两种,当事务中的所以步骤全部成功执行时,事务提交。如果其中一个步骤失败,将发生回滚操作,撤消撤消之前到事务开始时的所以操作。 事务的 ACID   事务具有四个特征:原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持续性( Durability )。这四个特性简称为 ACID 特性。   1 、原子性。事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做   2 、一致性。事 务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。   3 、隔离性。一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。   4 、持续性。也称永久性,指一个事务一旦提交

JAVA事务系列二:JDBC事务

非 Y 不嫁゛ 提交于 2020-02-22 15:17:28
事务的提交和回滚: 在JDBC API中,默认的情况为自动提交事务和回滚事务,也就是说,每一条对数据库的更新的sql语句代表一项事务,操作成功后,系统自动调用commit()来提交,否则将调用rollback()来撤消事务。 可以通过调用setAutoCommit(false) 来禁止自动提交事务。然后把多条更新数据库的sql语句做为一个事务,在所有操作完成之后,调用commit()来进行整体提交。倘若其中一项 sql操作失败,就不会执行commit()方法,而是产生相应的sqlexception,此时就可以捕获异常代码块中调用rollback()方法撤消事务。 public int delete(int sID) {   dbc = new DataBaseConnection();   Connection con = dbc.getConnection();   try {    con.setAutoCommit(false);// 更改JDBC事务的默认提交方式    dbc.executeUpdate("delete from xiao where ID=" + sID);    dbc.executeUpdate("delete from xiao_content where ID=" + sID);    dbc.executeUpdate("delete from

借鉴 spring 面试内容

风流意气都作罢 提交于 2020-02-21 16:40:29
1. Spring的IOC有三种注入方式 : 第一是根据属性注入,也叫set方法注入; 第二种是根据构造方法进行注入; 第三种是根据注解进行注入 Spring的优点 :主要是根据它的IOC和AOP体现的。IOC主要是解决了代码的耦合性问题,而AOP是面向切面编程的最好解释! 2.Spring中IOC, AOP IOC就是控制翻转或是依赖注入。通俗的讲就是如果在什么地方需要一个对象,你自己不用去通过new 生成你需要的对象,而是通过Spring的bean工厂为你长生这样一个对象。 AOP就是面向切面的编程。比如说你每做一次对数据库操作,都要生成一句日志。如果,你对数据库的操作有很多类, 那你每一类中都要写关于日志的方法。但是如果你用AOP,那么你可以写一个方法,在这个方法中有关于数据库操作的方法, 3.Spring的IOC/AOP/代理 IOC是控制反转,是Spring的核心思想。通过面向接口编程来实现对业务组件的动态依赖。 aop是面向切面编程,它并不是只在Spring或者java中才有的,它和面向对象编程(oop)是相对而言的另一种编程思想。 Spring在实现AOP编程时利用的是java的代理机制。个人觉得java代理机制真的是很神奇。核心内容并不多 4.Spring的IOC是解耦,AOP是干什么的 AOP面向切面编程将程序中的交叉业务逻辑(比如安全,日志,事务等)

3.1.4 Spring的事务管理

こ雲淡風輕ζ 提交于 2020-02-21 08:03:09
四、 Spring 的事务管理 事务原本是数据库中的概念, 在 Dao层。 但一般情况下, 需要将事务提升到 业务层, 即 Service层。 这样做是为了 能够使用事务的特性来管理具体的业务。 1. Spring事务管理API介绍 (1) 事务管理器是 PlatformTransactionManager接口 对象。 其主要 用于完成事务的提交、 回滚, 及获取事务的状态信息。 PlatformTransactionManager接口 常用的两个实现类 DataSourceTransactionManager: 使用JDBC或MyBatis 进行持久化数据时使用。 HibernateTransactionManager: 使用Hibernate进行持久化数据时使用。 (2) Spring的回滚方式 Spring事务的默认回滚方式是: 发生运行时异常时回滚, 发生受查异常时提交。 (3) 事务定义接口 事务定义接口 TransactionDefinition中定义了 事务描述 相关的三类常量: 事务隔离级别、 事务传播行为、 事务默认超时时限, 及对它们的 操作。 所谓事务传播行为是指, 处于不同事务中的方法在相互调用时, 执行期间事 务的维护情况。 如, A事务中的方法doSome() 调用B事务中的方法doOther() , 在调 用执行期间事务的维护情况, 就称为事务传播行为

[系统软件工程师面试] 6. mysql

别等时光非礼了梦想. 提交于 2020-02-21 02:54:50
1. Mysql内核 MyISAM和InnoDB内核选型 1. InnoDB 支持事务,MyISAM 不支持事务。这是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一; 2. InnoDB 支持外键,而 MyISAM 不支持。对一个包含外键的 InnoDB 表转为 MYISAM 会失败; 3. InnoDB 是聚集索引,MyISAM 是非聚集索引。聚簇索引的文件存放在主键索引的叶子节点上,因此 InnoDB 必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而 MyISAM 是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。 4. InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。而MyISAM 用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快; 5. InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁。一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞,因此并发访问受限。这也是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一; 如何选择: 1. 是否要支持事务

Redis事务介绍

我怕爱的太早我们不能终老 提交于 2020-02-20 03:26:07
是什么? 可以一次执行多个命令,本质是一组命令的集合,一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其他命令插入,不许加塞 能干嘛? 一个队列中,一次性、顺序性、排他性的执行一系列命令 怎么玩? redis常用命令: 1.DISCARD:取消事务,放弃执行事务块内的所有命令 2.EXEC:执行所有事务块内的命令 3.MULTI:标记一个事务块的开始 4.UNWATCH:取消WATCH命令对所有key的监视 5.WATCH key [key…]:监视一个或多个key,如果在事务执行之前这个(些)key被其他命令所改动,那么事务被打断 表锁: 进行操作时,锁住整张表,并发性差,但一致性好 行锁: 进行操作时,只所操作的那一条数据,并发性较高,但一致性较差 悲观锁: 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁 乐观锁 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。 乐观锁策略:提交版本必须大于记录当前版本才能执行更新

Java EE入门(五)——MySQL基础 (多表关系、范式、多表查询、事务、DCL)

元气小坏坏 提交于 2020-02-19 12:13:21
Java EE入门(五)——MySQL基础 (多表关系、范式、多表查询、事务、DCL)   iwehdio的博客园:https://www.cnblogs.com/iwehdio/ 1、多表关系 多表之间的关系: 一对一的关系。 一对多 或 多对一 的关系。 多对多的关系。 一对多关系实现:在多的一方建立外键列,指向一的一方的主键。 多对多关系实现:需要借助第三张中间表,中间表中至少包含两个字段,作为外键分别指向两张表的主键。这两个字段构成了联合主键。 一对一关系实现:在任意一方添加外键列,指向另一方的主键。而且需要在外键列添加唯一约束。 分析示例:用户收藏旅游线路。 三个实体:旅游线路分类、旅游线路、用户。 旅游线路分类和旅游线路是 一对多 的关系。 用户和收藏的旅游线路是 多对多 的关系。 实现: CREATE TABLE category( cid INT PRIMARY KEY AUTO_INCREMENT, cname VARCHAR(100) NOT NULL UNIQUE ); CREATE TABLE route( rid INT PRIMARY KEY AUTO_INCREMENT, rname VARCHAR(100) NOT NULL UNIQUE, CONSTRAINT r_c FOREIGN KEY (rid) REFERENCES category

MySQL事务之可重复读

不问归期 提交于 2020-02-19 11:37:14
在事务的并发操作中,也就是多个事务同时对同一组数据进行操作时,可能会出现脏读、不可重复读、幻读、丢失更新这四个问题,本篇博客就来为大家讲解 不可重复读 问题。 一、不可重复读概述 不可重复读 就是一个事务读到另一个事务修改后并提交的数据(update)。在同一个事务中,对于同一组数据读取到的结果不一致。比如,事务B 在 事务A 提交前读到的结果,和在 事务A 提交后读到的结果可能不同。不可重复读出现的原因就是由于事务并发修改记录而导致的。   隔离级别 有四种,分别是:读未提交、读已提交、可重复读、序列化。   读未提交: Read Uncommitted,顾名思义,就是一个事务可以读取另一个未提交事务的数据。最低级别,它存在4个常见问题(脏读、不可重复读、幻读、丢失更新)。   读已提交: Read Committed,顾名思义,就是一个事务要等另一个事务提交后才能读取数据。 它解决了脏读问题,存在3个常见问题(不可重复读、幻读、丢失更新)。   可重复读: Repeatable Read,就是在开始读取数据(事务开启)时,不再允许修改操作 。它解决了脏读和不可重复读,还存在2个常见问题(幻读、丢失更新)。   序列化: Serializable,序列化,或串行化。就是将每个事务按一定的顺序去执行,它将隔离问题全部解决,但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。