mysql事务

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

MySQL学习笔记(8)

一世执手 提交于 2020-02-24 02:10:39
SQL的子查询: || 知识点很简单,主要是练习(之前笔记有练习) – MySQL学习笔记(实操)(6) – MySQL学习笔记(实操)(7) SQL的联结: || 什么是联结:两张表通过其中有关系的列进行联结,在有些时候,比复杂的子查询嵌套会更方便 || 所有联结都需要两个要素,1,被联接的表 2,联结方式 3,联结关系 || 联结方式一:where 联结 (使用情景:常用于等值联结) || 联结方式二:内联结 (使用情景:常用于等值联结) ( join 或 inner join ) mysql > select * from score inner join course on score . course_id = course . course_id ; + ------------+-----------+--------+-----------+-------------+------------+ | student_id | course_id | degree | course_id | course_name | teacher_id | + ------------+-----------+--------+-----------+-------------+------------+ | 103 | 3 - 105 | 92 | 3 - 105 |

mysql的事务隔离级别

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

深入了解分布式.md

落花浮王杯 提交于 2020-02-21 18:57:17
深入了解分布式 分布式事务 分布式事务概念 分布式事务产生的原因 事务的ACID特性 分布式理论 CAP理论 BASE理论 分布式事务的应用场景 常见的分布式事务解决方案 两阶段提交 TCC编程模式 TCC开源框架-tcc-transaction TCC使用关键技术分析 分布式项目使用tcc-transaction框架 发布服务 调用服务 LCN解决方案 参考链接 分布式事务 分布式事务概念 分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。 分布式事务是为了保证不同数据库的数据一致性 分布式事务产生的原因 数据库分库分表 当数据库单表一年产生的数据超过1000W,那么就要考虑分库分表 应用SOA化 所谓的SOA化,就是业务的服务化。现在对整个网站进行拆解,分离除了订单中心、用户中心、库存中心。 事务的ACID特性 原子性(Atomicity) 所谓的原子性就是说,在整个事务中的所有操作,要么全部完成,要么全部不做,没有中间状态。对于事务在执行中发生错误,所有的操作都会被回滚,整个事务就像从没被执行过一样。 一致性(Consistency) 事务的执行必须保证系统的一致性,就拿转账为例,A有500元,B有300元,如果在一个事务里A成功转给B50元,那么不管并发多少,不管发生什么,只要事务执行成功了

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. 是否要支持事务

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,序列化,或串行化。就是将每个事务按一定的顺序去执行,它将隔离问题全部解决,但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

MySQL如何找出未提交事务信息

爷,独闯天下 提交于 2020-02-19 08:44:59
前阵子,我写了一篇博客 “ ORACLE中能否找到未提交事务的SQL语句 ” , 那么在MySQL数据库中,我们能否找出未提交事务执行的SQL语句或未提交事务的相关信息呢? 实验验证了一下,如果一个会话(连接)里面有一个未提交事务,然后不做任何操作,那么这个线程处于Sleep状态 mysql> select connection_id() from dual; +-----------------+ | connection_id() | +-----------------+ | 6 | +-----------------+ 1 row in set (0.00 sec) mysql> set session autocommit=0; Query OK, 0 rows affected (0.00 sec) mysql> delete from kkk where id =1; Query OK, 1 row affected (0.00 sec) mysql> 在另外一个会话(连接)里面,查询这个超过10秒未提交事务的详细信息: SELECT t.trx_mysql_thread_id ,t.trx_state ,t.trx_tables_in_use ,t.trx_tables_locked ,t.trx_query ,t.trx_rows_locked ,t.trx

JDBC总结——事务

本秂侑毒 提交于 2020-02-19 05:24:16
文章目录 事务 一、事务的基本介绍 1、概念 2、操作 3、操作实例 4、MySQL数据库中默认自动提交 二、事务的四大特征 三、事务的隔离级别 1、概念 2、存在的问题 3、隔离级别 四、Jdbc事务控制 1、概述 2、控制事务的API: 3、核心代码 事务 一、事务的基本介绍 1、概念 如果包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。 2、操作 ① 开启事务: start transaction; ② 回滚: rollback; ③ 提交: commit; 3、操作实例 account.sql -- 创建account表 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