BCSP-玄子JAVA开发之JAVA数据库编程CH-06_MySQL数据库企业开发技术

BCSP-玄子JAVA开发之JAVA数据库编程CH-06_MySQL数据库企业开发技术

6.1 事务

6.1.1 什么是事务

TRANSACTION

  • 是将一系列数据操作捆绑成为一个整体进行统一管理机制
  • 多个操作作为一个整体向系统提交,要么都执行、要么都不执行
  • 是一个不可分割的工作逻辑单元

6.1.2 事务的特性

事务必须具备的属性,简称 ACID 属性

ACID 属性描述
原子性:Atomicity 事务是一个完整的操作,事务的各步操作是不可分的(原子的),要么都执行,要么都不执行
一致性:Consistency 当事务完成时,数据必须处于一致状态
隔离性:Isolation 并发事务之间彼此隔离、独立,不应以任何方式依赖于或影响其他事务
持久性:Durability 事务完成后,它对数据库的修改被永久保持

6.1.3 如何创建事务

MySQL中支持事务的存储引擎

  • InnoDB支持事务操作

    • 通过UNDO日志和REDO日志实现对事务的支持

    • UNDO日志

      • 复制事务执行前的数据,用于在事务发生异常时回滚数据
    • REDO日志

      • 记录在事务执行中,每条对数据进行更新的操作
      • 当事务提交时,该内容将被刷新到磁盘
  • MyISAM不支持事务操作

实现事务的方式

  • SQL语句
  • 设置自动提交关闭或开启

在执行命令SET autocommit=0,禁止当前会话的自动提交后,后面的SQL语句将作为事务中的语句一同提交

6.1.4 使用 SQL 语句实现事务处理

开始事务

BEGIN ;
或
START TRANSACTION;

提交事务

COMMIT ;

回滚(撤销)事务

ROLLBACK ;

使用事务实现小王和小张之间的转账操作

USE paycorp;
BEGIN;
    UPDATE account SET balance=balance-2000 WHERE accountName='小王';
    UPDATE account SET balance=balance+2000 WHERE accountName='小张';
COMMIT;

小王和小张的总账户余额和转账前保持一致,数据库中数据从一个一致性状态更新到另一个一致性状态

6.1.5 自动关闭和开启事务

  • 默认情况下,每条单独的SQL语句视为一个事务

  • 关闭默认提交状态后,可手动开启、关闭事务

关闭/开启自动提交

 SET autocommit = 0|1;
  • 状态值为0:关闭自动提交
  • 值为1:开启自动提交

关闭自动提交后,从下一条SQL语句开始将会开启新事务,需使用COMMIT或ROLLBACK语句结束该事务

6.1.6 使用事务时要遵循的原则

事务尽可能简短

  • 事务启动至结束后在数据库管理系统中保留大量资源,以保证事务的原子性、一致性、隔离性和持久性
  • 如果在多用户系统中,较大的事务将会占用系统的大量资源,使得系统不堪重负,会影响软件的运行性能,甚至导致系统崩溃

事务中访问的数据量尽量最少

  • 当并发执行事务处理时,事务操作的数据量越少,事务之间对操作数据的争夺就越少

查询数据时尽量不要使用事务

  • 对数据进行浏览查询操作并不会更新数据库的数据时,尽量不使用事务查询数据,避免占用过量的系统资源

在事务处理过程中尽量不要出现等待用户输入的操作

  • 处理事务的过程中,如果需要等待用户输入数据,那么事务会长时间占用资源,有可能造成系统阻塞

6.2 索引

6.2.1 什么是索引

是对数据库表中一列或多列值进行排列的一种结构

  • 作用

    • 大大提高数据库的检索速度

    • 改善数据库性能

  • MySQL索引按存储类型分类

    • B-树索引(BTREE)

      • InnoDB、MyISAM均支持
    • 哈希索引(HASH)

  • 数据存储在数据表中,而索引是创建在数据库表对象上

  • 由表中的一个字段或多个字段生成的键组成

    • 通过索引,可以极大的提升数据查询效率,改善数据库的性能

Indexes Use Key Values to Locate Data

(根据索引键查找定位数据行)

6.2.2 常用索引类型

普通索引

  • 基本索引类型
  • 允许在定义索引的列中插入重复值和空值

唯一索引

  • 索引列数据不重复
  • 允许有空值

主键索引

  • 主键列中的每个值是非空、唯一的
  • 一个主键将自动创建主键索引

复合索引

  • 将多个列组合作为索引

全文索引

  • 支持值的全文查找
  • 允许重复值和空值

6.2.3 创建/删除索引

创建索引

CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name ON table_name (column_name [length] …);
-- 唯一索引、全文索引或空间索引,可选

如果创建索引是未指定创建索引的类型,则创建的索引为普通索引通过CREATE INDEX语句无法创建主键索引,主键索引的创建语句

删除索引

ALTER TABLE tablename ADD PRIMARY KEY(column)

删除表时,该表的所有索引同时会被删除

6.2.4 创建索引的指导原则

按照下列标准选择建立索引的列

  • 频繁搜索的列
  • 经常用作查询选择的列
  • 经常排序、分组的列经常用作连接的列(主键/外键)

不要使用下面的列创建索引

  • 仅包含几个不同值的列
  • 表中仅包含几行

6.2.5 使用索引时注意事项

  • 查询时减少使用*返回表的全部列,不要返回不需要的列

  • 索引应该尽量小,在字节数小的列上建立索引

  • WHERE 子句中有多个条件表达式时,包含索引列的表达式应置于其他条件表达式之前

  • 避免在 ORDER BY 子句中使用表达式

  • 根据业务数据发生频率,定期重新生成或重新组织索引,进行碎片整理

6.2.6 查看索引 / 删除索引

查看已创建的索引信息

SHOW INDEX FROM table_name;

删除索引

DROP INDEX index_name ON table_name;

删除表时,该表的所有索引将同时被删

除删除表中的列时,如果要删除的列为索引的组成部分,则该列也会从索引中删除

如果组成索引的所有列都被删除,则整个索引将被删除


6.3 视图

6.3.1 为什么需要视图

不同的人员关注不同的数据

保证信息的安全性

6.3.2 什么是视图

视图是一张虚拟表

  • 表示一张表的部分数据或多张表的综合数据
  • 其结构和数据是建立在对表的查询基础上

视图中不存放数据

  • 数据存放在视图所引用的原始表中

一个原始表,根据不同用户的不同需求,可以创建不同的视图

  • 筛选表中的行
  • 防止未经许可的用户访问敏感数据
  • 降低数据库的复杂程度
  • 将多个物理数据表抽象为一个逻辑数据表

6.3.3 视图的好处

开发人员

  • 限制数据检索更容易
  • 维护应用程序更方便

最终用户

  • 结果更容易理解
  • 获得数据更容易

6.3.4 创建 / 查看视图

使用SQL语句创建视图

CREATE VIEW view_name  
   AS